【问题标题】:node.js mongoError not authorized on admin to execute commandnode.js mongoError 管理员未授权执行命令
【发布时间】: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 - -

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案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
      • 谢谢,我更新了答案,并在上面的答案中添加了对您的答案的引用:)
      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 2015-07-31
      相关资源
      最近更新 更多