node.js mongoError 管理员未授权执行命令

Posted

技术标签:

【中文标题】node.js mongoError 管理员未授权执行命令【英文标题】:node.js mongoError not authorized on admin to execute command 【发布时间】:2019-07-25 23:17:39 【问题描述】:

我正在研究 Node.js,但我找不到任何解决方案.. 我的控制台向我发送了许多消息,其中一个更特别奇怪:GET/signup - - ms - - 有人对此有任何想法吗? 提前致谢!

///////////////////////inclusion des librairies
 // 3 librairies pour gérer les messages flash
 var session = require('express-session');
 var cookieParser = require('cookie-parser');
 var flash = require('express-flash');
 //passerelle pour se connecter à node(node->bdd)
 var passport =require('passport');
 // stockage des sessions(id) et cookies côté serveur uniquement
 var mongoStore =require('connect-mongo')(session); // le session de express-session

//inclure al librairie  express
 var express = require('express');
// Inclusion de la librairie morgan (faire le lien avec la base de données)
var morgan = require('morgan');

// Inclusion de mongoose
 var mongoose = require('mongoose');

 //Inclusion moteur templates ejs
 var ejs = require('ejs');
  var engine =require('ejs-mate');
  // Inclusion de body parser pour les données des formulaires
  var bodyParser = require('body-parser');



  /////////////////////fin des librairies ///////////////

// stocker l'objet express dans une variable plus courte
 
 var app = express();



//inclure le fichier secret.js
var secret = require('./config/secret');
 ////////////connexion à la bd avec mongoose///
 
 mongoose.connect(secret.database, // voir pour création de db en ligne !!
 	useNewUrlParser:true,
 	function(err)
 		if(err)console.log(err)
 		else
 			console.log('connexion OK');
 		
 	);


/////////////////// gestion des Passerelles (middleware)/////////////////////////
app.use(express.static(__dirname + '/public')); // pour le style
app.use(morgan('dev'));
app.engine('ejs',engine);
app.set('view engine','ejs');
// les deux lignes ci-dessous pour récupérer les données des formulaires
app.use(bodyParser.json());
app.use(bodyParser.urlencoded(extended:true));
// affichage messages flash et gestion des cookies
app.use(cookieParser());
app.use(session(
	resave :true,
	saveUninitialized:true,
	secret :secret.secretKey,
	store : new mongoStore(
		url:secret.database,
		autoReconnect:true )
));

app.use(flash());

//authentification
app.use(passport.initialize());
app.use(passport.session());


////////////////définition du chemin des pages principales////////////////////////

var mainRoutes =require('./routes/main');
app.use(mainRoutes);

var userRoutes =require('./routes/user');
app.use(userRoutes);



//app.post()

//app.put()

//app.delete()

控制台说:

Le serverur est lancé sur le port3000 (node:7828) DeprecationWarning: collection.ensureIndex 已弃用。请改用 createIndexes。 连接OK(节点:7828)UnhandledPromiseRejectionWarning:MongoError: 管理员未授权执行命令 insert: "system.indexes", 文件:[[ns admin.sessions key [expires 1] name expires_1 expireAfterSeconds 0 unique false]],有序:true 在 Function.MongoError.create (C:\Users\Utilisateur\Desktop\NODE\ECommerce\node_modules\connect-mongo\node_modules\mongodb-core\lib\error.js:31:11) 在 C:\Users\Utilisateur\Desktop\NODE\ECommerce\node_modules\connect-mongo\node_modules\mongodb-core\lib\connection\pool.js:497:72 在 authenticateStragglers (C:\Users\Utilisateur\Desktop\NODE\ECommerce\node_modules\connect-mongo\node_modules\mongodb-core\lib\connection\pool.js:443:16) 在 Connection.messageHandler (C:\Users\Utilisateur\Desktop\NODE\ECommerce\node_modules\connect-mongo\node_modules\mongodb-core\lib\connection\pool.js:477:5) 在 TLSSocket。 (C:\Users\Utilisateur\Desktop\NODE\ECommerce\node_modules\connect-mongo\node_modules\mongodb-core\lib\connection\connection.js:333:22) 在 TLSSocket.emit (events.js:182:13) 在 addChunk (_stream_readable.js:283:12) 在 readableAddChunk (_stream_readable.js:264:11) 在 TLSSocket.Readable.push (_stream_readable.js:219:10) 在 TLSWrap.onStreamRead [as onread] (internal/stream_base_commons.js:94:17) (node:7828) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这 错误源于在异步函数内部抛出 没有 catch 块,或拒绝未处理的承诺 使用 .catch()。 (拒绝 ID:1)(节点:7828)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的 Node.js 进程。获取 / 登录 - - 毫秒 - - 获取 /login - - ms - - GET /login - - ms - - GET /signup - - ms - -

【问题讨论】:

【参考方案1】:

您似乎正在尝试访问 MongoDB 的管理数据库并插入不允许的内容。我假设您使用的连接字符串如下:

mongodb://mongodb0.example.com:27017/admin

确保将/admin 更新到要连接的数据库。

【讨论】:

您好,尼克,谢谢您的回答。我将这种连接用于 mongodb Atlas:mongodb+srv://root:@cluster0-zfgku.mongodb.net/test?retryWrites=true。我可以添加用户,但没有会话 ID,这很奇怪。也许“connect-mongo”库有问题? 如果您可以访问数据库以保存用户,则连接正常。我认为您的问题与未将 Mongoose 连接传递给会话有关。我想你可能想考虑重用你的连接。在此处查看“重用 Mongoose 连接”部分:npmjs.com/package/connect-mongo【参考方案2】:

npm 模块 connect-mongo 无法处理 mongodb+srv:// 连接字符串。您必须使用以mongodb:// 开头的旧连接字符串类型。

如果您使用的是 MongoDB Atlas,我建议您转到集群视图上的 connect,然后连接您的应用程序,然后选择 Node.js 2.2 版。 12,不是 3.0

您可能还必须将连接字符串中的/test/admin 更改为/TheNameOfYourDatabase,并在其中使用您的数据库名称。 (见下文radihuq's answer)

【讨论】:

消耗了很多 ConstJS !我以前没有看到你的asweer。一切正常!再次感谢:) 很高兴它成功了! @cessother 您能否将其标记为已回答? :) 我很乐意这样做,但我还有一个问题:如何将其标记为已回答? :) 点击答案旁边的复选标记,将其从灰色切换为已填充。这将其标记为已回答:) 一直在努力解决这个问题,这终于奏效了。谢谢。为了帮助其他人——这也表现为:MongoError: Cannot do raw queries on admin in atlas【参考方案3】:

此错误是特定于您传递的 URL mongo-connect 不知道如何处理的事实。除了 URL,您可以传递 mongoose.Connection 对象并在 MongoStore 选项对象中使用 mongooseConnection 属性。

new mongoStore(
  mongooseConnection: mongoose.connection,
  autoReconnect: true 
)

为了使其正常工作,您需要先建立连接,然后将 mongoose.connection 对象传递给您的 mongoStore 类。

 mongoose.connect(secret.database, useNewUrlParser:true, function(err) 
    if(err)  
      console.log(err)
     else 
      app.use(session(
        resave :true,
        saveUninitialized:true,
        secret :secret.secretKey,
        store : new mongoStore(
          url:secret.database,
          autoReconnect:true )
      ));
      console.log('connexion OK');
    
);

有更优雅的方法来处理它,但这应该让你开始。

【讨论】:

【参考方案4】:

@ConstJS 答案对我有用。稍微扩展一下 -

如果您使用 Postman 并且您的错误如下所示:

"errmsg": "管理员未授权执行命令 insert: [..] , $db: \"admin\" "

注意这个特定的部分:

$db:\"管理员\"

您需要将其更改为您的数据库名称,因此请转到您的 URI 并找到

mongodb.net:27017/admin

并将 admin 更改为您的数据库名称

【讨论】:

这也应该是一个可接受的答案。谢谢@Taslim 谢谢,我更新了答案,并在上面的答案中添加了对您的答案的引用:)

以上是关于node.js mongoError 管理员未授权执行命令的主要内容,如果未能解决你的问题,请参考以下文章

Node.Js - Jest 测试(令牌问题得到 401“未授权”)

带有gmail api的node js,API返回错误:错误:未授权客户端

Node js 或 Express js 的基于角色的授权

使用 Mongoose 在 Node JS 中进行全文搜索

MongoError:未在 db 上授权执行命令?与 socket.io 连接时

MongoError:没有可用的主服务器