开发者社区> 问答> 正文

nodejs连接mongodb不成功的问题

代码:

var express = require('express');
var mongodb = require('mongodb');
var app = express();
app.use(express.static('./website'));
var url = 'mongodb://localhost:27017/test';
mongodb.MongoClient.connect(url, function (err, db) {
    if (err) {
        console.log(err);
        return false;
    }
    console.log(db);
});
app.listen(9000);
console.log('running');
mongodb服务已经开启:
mongod -f mongodb.conf --journal

因为机器是32位的,所以,增加了--journal参数
如图:
screenshot
运行mongodb客户端,可以正常运行,如图:
screenshot
但是,启动nodejs后,后台报错:

running
{ [MongoError: connect UNKNOWN 127.0.0.1:27017 - Local (undefined:undefined)]
  name: 'MongoError',
  message: 'connect UNKNOWN 127.0.0.1:27017 - Local (undefined:undefined)' }

这是什么原因?

展开
收起
蛮大人123 2016-06-15 11:41:48 6042 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    参数就是开启和关闭认证,如果是conf配置文件,应该是auth=true或false
    1,首先关闭认证,也就是不带--auth参数,启动mongodb
    2,使用命令行进入mongodb目录,输入mongo命令,默认进入test数据库
    3,use userdb 切换到自己的数据库,输入db,显示userdb
    4,创建用户,角色为dbOwner,数据库为userdb,命令行应该是db.createUser({user:'myuser',pwd:'123456',roles:[{role:'dbOwner',db:'userdb'}]})
    5,切换到admin数据库,use admin,db ,显示admin,db.shutdownServer()关闭服务器,填上认证参数,启动mongodb;以前的版本此时使用mongovue就可以使用myuser登录到userdb数据库上了,但是3.0.3版本不行,打开mongodb.log文件发现如下错误

    authenticate db: userdb { authenticate: 1, nonce: "xxx", user: "myuser", key: "xxx" } 
    2015-06-02T09:57:18.877+0800 I ACCESS   [conn2] Failed to authenticate myuser@userdb with mechanism MONGODB-CR: AuthenticationFailed MONGODB-CR credentials missing in the user document 

    此1-5步骤针对是3.0.3以前版本已经ok,如果是3.0.3,mongodb加入了SCRAM-SHA-1校验方式,需要第三方工具配合进行验证,下面给出具体解决办法:
    首先关闭认证,修改system.version文档里面的authSchema版本为3,初始安装时候应该是5,命令行如下:

    > use admin 
    switched to db admin 
    >  var schema = db.system.version.findOne({"_id" : "authSchema"}) 
    > schema.currentVersion = 3 
    3 
    > db.system.version.save(schema) 
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 

    不过如果你现在开启认证,仍然会提示AuthenticationFailed MONGODB-CR credentials missing in the user document
    原因是原来创建的用户已经使用了SCRAM-SHA-1认证方式

    > use admin 
    switched to db admin 
    > db.system.users.find() 
    [...] 
    { "_id" : "userdb.myuser", "user" : "myuser", "db" : "userdb", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "XXXXXXXXXXXXXXXXXXXXXXXX", "storedKey" : "XXXXXXXXXXXXXXXXXXXXXXXXXXX", "serverKey" : "XXXXXXXXXXXXXXXXXXXXXXXXXXX" } }, "roles" : [ { "role" : "dbOwner", "db" : "userdb" } ] } 

    解决方式就是删除刚刚创建的用户,重新重建即可:

    > use userdb 
    switched to db userdb 
    > db.dropUser("myuser") 
    true 
    >db.createUser({user:'myuser',pwd:'123456',roles:[{role:'dbOwner',db:'userdb'}]}) 
    2019-07-17 19:39:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
探究 Node.js 的服务端之路 立即下载
个推微服务实践 基于OpenResty 和Node.js 立即下载
沪江基于Node.js大规模应用实践 立即下载