如何在Node.js中验证Mongoose连接MongoDB

14

我使用命令创建了MongoDB用户

use admin
db.createUser(
    {
      user: "superuser",
      pwd: "12345678",
      roles: [ "root" ]
    }
)

然后在我的应用程序中,我正在尝试像这样连接mongoose

var options = {
user: "superuser",
pass: "12345678"
};


var mongooseConnectionString = 'mongodb://localhost/twitter-mongo';

mongoose.connect(mongooseConnectionString,options);
mongoose.model('User', UserSchema);

var User = mongoose.model('User');

当我通过mongoose插入数据时,出现了这个错误。

MongoError: not authorized for insert on twitter-mongo.users
请告诉我我的代码哪里出了问题。
7个回答

37

为了指定包含用户凭据的数据库名称,您必须在连接字符串中声明authSource参数:

var options = {
  user: "superuser",
  pass: "12345678"
};

var mongooseConnectionString = 'mongodb://localhost/twitter-mongo?authSource=admin';

注意:对于使用Mongoose 4.x的用户,您可能还需要在选项对象中包含useMongoClient: true。这将使得Please authenticate using MongoClient.connect with auth credentialsopen() is deprecated错误消息消失。


谢谢。我为此苦恼了几个小时 :) - MEDZ
1
在 mongoose 5.x 中,useMongoClient 选项不再必要,请将其移除。 - MeVimalkumar

10

这个工作正常:

var options = { server: { socketOptions: { keepAlive: 1 } } };
var connectionString = 'mongodb://admin:admin1234@localhost:27017/myDB';

 mongoose.connect(connectionString, options);

//Add those events to get more info about mongoose connection:

// Connected handler
mongoose.connection.on('connected', function (err) {
  console.log("Connected to DB using chain: " + connectionString);
});

// Error handler
mongoose.connection.on('error', function (err) {
  console.log(err);
});

// Reconnect when closed
mongoose.connection.on('disconnected', function () {
   self.connectToDatabase();
});

5
这似乎已经过时了。 - geeky_monster

4
尝试这个。
const mongooseConnectionString = 'mongodb://superuser:12345678@ localhost/twitter-mongo?authSource=admin'

2

我使用Docker运行了一个Mongo服务,然后使用以下代码将我的mongoose连接到它

Original Answer翻译成"最初的回答"

const _database = 'mongodb://user:pass@localhost:port/MyDB?authSource=admin';
mongoose.connect(_database, {
    useNewUrlParser: true
})
.then(() => console.log('Connected to MongoDB ...'))
.catch(err => console.error('Could not connect to MongoDB:‌', err));

最初的回答
这相当于
mongo --username user --password pass --authenticationDatabase admin --port 27017

在连接后,可以使用 MyDB 数据库进行操作,如查找、聚合、插入等。

如果您的数据库没有用户(MongoDB默认用户),则可以像下面这样更改数据库

最初的回答:

在连接后,使用MyDB数据库进行操作,例如查找、聚合、插入等。如果您的数据库没有用户(MongoDB默认用户),则可以像下面这样更改Database:。

const _database = 'mongodb://localhost:port/MyDB';

27017 是 MongoDB 的默认端口,如果您的 MongoDB 端口没有更改,则端口也可以采用同样的方式。

最初的回答: 如果您的 MongoDB 端口未更改,则默认端口为27017,因此您也可以对端口进行相同的操作。
const _database = 'mongodb://localhost/MyDB';

最初的回答

这与下面的内容相同:

mongo

以上代码之所以存在,是因为没有用户和端口,因此不需要进行身份验证数据库。

“Original Answer”可翻译为“最初的回答”。


1
mongoose.createConnection('mongodb://username:password@35.238.xxx.xxx:27017/dashboards?authSource=admin', {
   useNewUrlParser: true
}, (e) => {

    if (e) throw console.error('Error connecting to mongo database master');
    console.log('Connected to mongo database master.');

});

虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Piotr Labunski

0

您需要在您正在操作的数据库中创建一个用户,而不是管理员数据库。

使用以下命令:

use twitter-mongo;
db.createUser({
  user: "superuser",
  pwd: "12345678",
  roles: [ "root" ]
});

不要用这个,

use twitter-mongo
db.createUser({
  user: "superuser",
  pwd: "12345678",
  roles: [ "root" ]
});

0

创建连接字符串的正确方法如下: var connection = mongoose.createConnection("mongodb://username:pwd@hostip:port/dbname?authSource=admin", options);

请在连接字符串中使用authSource=admin进行认证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接