nodejs mongodb账号密码连接

2021-01-12 11:01:12

参考地址  Nodejs通过账号密码连接MongoDB数据库

有时候你发生MongoError: getaddrinfo ENOTFOUND   这样的错误,并不都是网络连接不上,或者主机不存在,又可能是你认证没有通过哦。还有的时候,连接成功了,但是访问不到数据,也是认证的问题哦。

解决代码如下 

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

// Connection URL
const url = 'mongodb://root:asdfoijkl456@42.139.115.133:27017/?authMechanism=SCRAM-SHA-1&authSource=article';

// Database Name
const dbName = 'article';

// Create a new MongoClient
const op = {
  useNewUrlParser: true,
}

const client = new MongoClient(url, op);

(async function () {
  await client.connect();
  const db = client.db(dbName);
  const res = await db.collection('articleList').find().toArray();
  console.log(res);
  client.close()
})();

上周遇到了MongoDB数据库的数据被全部盗取的情况,没想到这种事情也发生了在我的身边,主要因为把MongoDB服务暴露在了外网上面,所以也怪不得谁了,后面决定为MongoDB设置账号密码,以下为设置账号和密码的全过程,后面还有通过Nodejs连接数据库的一个坑。
1.创建管理员
首先开启Mongo服务,然后切换admin数据库,一开始是没有这个数据库的。

> use admin1

2.然后创建用户和密码:

> db.createUser({user:’root’,pwd:’root1234’,roles:[‘root’]})1

3.创建了管理员账号和密码之后,然后运行Mongo服务的时候加上 –auth参数:

mongod --dbpath "F:mongodb\data\db" --logpath "F:\mongodb\data\log\MongoDB.log" --auth1

4.这时候如果直接登录数据库,想查看数据,是看不了的,需要用以下命令才能登录成功,如果打印出来一个’1’,说明登录成功:

> db.auth('root','root1234')112

到这一步,MongoDB设置账号密码就已经完成了,接下来我需要用Nodejs来连接数据库,我用的是mongoose这个库,他提供了Schema、Model和Document对象,用起来非常方便,但是当我按照官网的例子来写时发现并不成功,如下:

var mongoose=require("mongoose")

mongoose.connect('mongodb://root:root1234@localhost:27017/test');123

一直都是报错,说验证失败
这里写图片描述

后面查了很多资料也没有查到,无奈只有再去研究官方API,在官方API中看到:

mongoose.connect('mongodb://username:password@host:port/database?options...');1

这是官网连接的例子,后面有一个options参数,我怀疑这里是否需要写一些参数,但是在实际的例子中没有看到后面写任何参数,然后找到官网中对于options的说明,如下:
这里写图片描述
看到第一个参数authSource,他的描述是:If the database authentication is dependent on another databaseName. 他的意思是如果数据库认证需要依赖于另外一个数据库名称。我想了想,我们的数据库账号密码不是存储admin数据库嘛,而我们现在需要连接的是另外一个数据库,可以试着加这个参数看看,就是authSource=admin。果然,加上这个参数之后,就可以成功的连接上数据库了,看来还是官网文档靠谱,遇到问题一定要先看看官方文档说明,很多问题有可能就解决了。
以上就是Nodejs连接设置了账号密码的MongoDB数据库的一些坑,在网上没有看到解决方案,希望大家看到了有所启示。


  • 2020-04-15 17:00:07

    export和import的理解,这一篇问扎根就够了

    在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

  • 2020-04-15 21:14:13

    .d.ts与.ts的区别 .d.ts怎么用

    在TypeScript项目中直接引入Javascript包是不能使用的,因为包中缺少TypeScript类型声明,如果是自己写的包,可以考虑自己增加一个.d.ts类型声明文件,如果代码比较多或者使用的是第三方的包,自己写就比较麻烦了。第三方的包首先考虑找一个别人写好的声明文件,如果没有可以使用一些自动生成声明文件的工具。

  • 2020-04-17 09:27:38

    推荐一个老前端开发者的博客

    前端修炼场,首页标签大全greenSock前端研究VUE研究我们的作品flash技术探讨开发心得个人档案培训与招聘服务报价

  • 2020-04-17 09:41:47

    前端css博客推荐

    这个博客有大量的css内容,有svg,TweenMax等教程,抽空通读一下

  • 2020-04-17 10:20:47

    GreenSocks Animation Platform详细工作机制以及TweenMax用法

    GSAP(GreenSocks Animation Platform)是一个性能较好的前端动画库。最近在写一个前端SVG动画编辑器时选择了它作为底层的动画库。为了减少踩坑,我大致浏览了它的源代码,这篇文章主要是对我的理解进行记录。 我会先简单介绍一下这个动画库的API,再介绍它的插件机制,最后会从一个用例出发跟踪其运行机制。

  • 2020-04-17 10:39:02

    CSS 滤镜技巧与细节,实现火焰,融合等特效

    简单来说,CSS 滤镜就是提供类似 PS 的图形特效,像模糊,锐化或元素变色等功能。通常被用于调整图片,背景和边界的渲染。本文就会围绕这些滤镜展开,看看具体能怎么使用或者玩出什么花活。

  • 2020-04-17 10:42:29

    (三)TweenMax运动效果

    运动效果 实例化对象.set() 立刻运动到指定地点,不用加时间

  • 2020-04-17 11:19:55

    Vue中的is和操作DOM

    vue中is的属性引入是为了解决dom结构中对放入html的元素有限制的问题,譬如ul里面要接上li的标签,引入is的属性后,你完全可以写成这样