Node.js中的MongoError:未经授权的管理员执行命令

7

我正在学习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()

控制台显示:

服务器已在端口3000上启动(node:7828)DeprecationWarning:collection.ensureIndex已弃用,请改用createIndexes。连接正常(node:7828)UnhandledPromiseRejectionWarning:MongoError:未经授权的操作,无法执行命令 {insert:"system.indexes",documents:[ [{ns admin.sessions} {key [{expires 1}]} {name expires_1} {expireAfterSeconds 0} {unique false}]],ordered:true} at 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进行身份验证Stragglers(C:\ Users \ Utilisateur \ Desktop \ NODE \ ECommerce \ node_modules \ connect-mongo \ node_modules \ mongodb-core \ lib \ connection \ pool.js:443:16)at Connection.messageHandler(C:\ Users \ Utilisateur \ Desktop \ NODE \ ECommerce \ node_modules \ connect-mongo \ node_modules \ mongodb-core \ lib \ connection \ pool.js: 477:5)at TLSSocket。 (C:\ Users \ Utilisateur \ Desktop \ NODE \ ECommerce \ node_modules \ connect-mongo \ node_modules \ mongodb-core \ lib \ connection \ connection.js:333:22)at TLSSocket.emit(events.js:182:13)at addChunk(_stream_readable.js:283:12)at readableAddChunk(_stream_readable.js:264:11)at TLSSocket.Readable.push(_stream_readable.js:219:10)在TLSWrap上的onStreamRead [as onread](internal / stream_base_commons.js:94:17)(node:7828)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误要么是由于在异步函数中抛出而没有catch块,要么是由于拒绝了未处理的承诺而没有处理它(拒绝ID:1)(node:7828)[DEP0018] DeprecationWarning:未处理的承诺拒绝已过时。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。GET /login- - ms - - GET /login - - ms - - GET /login - - ms - - GET /signup - - ms - -

5个回答

34

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

如果您正在使用MongoDB Atlas,我建议您转到群集视图上的连接,然后连接您的应用程序,然后选择Node.js版本2.2.12,而不是3.0

您可能还需要将连接字符串中的 /test/admin 改为 /TheNameOfYourDatabase,并将数据库名称替换为您的数据库名称。(参见下面radihuq的回答)


非常感谢ConstJS!我之前没有看到你的回答。现在一切都正常工作了!!再次感谢 :) - cessother
太好了,它起作用了!@cessother,你能标记一下吗? :) - ConstJS
我会很乐意地做到,但我有一个问题:我该如何将其标记为已回答? :) - cessother
点击答案旁边的复选框,将其从灰色变为填充状态。这将标记它已被回答 :) - ConstJS
1
一直在尝试解决这个问题,终于成功了。谢谢。为了帮助其他人——这也会出现为:MongoError: Cannot do raw queries on admin in atlas。 - Doa
仅切换到版本2.2.12,这对我起作用了。 - Faris Marouane

5

@ConstJS的回答对我很有用。稍微扩展一下 -

如果你正在使用Postman,且出现以下错误:

"errmsg": "not authorized on admin to execute command { insert: [..] }, $db: \"admin\" }"

请注意这部分:

$db: \"admin\"

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

mongodb.net:27017/admin

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


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

0

看起来这个错误是通用的,我之所以会遇到这个错误,是因为我的连接字符串中没有包含数据库的名称:

"mongodb+srv://<username>:<password>@searchpractice0.rh7gx.mongodb.net/<NameOfDatabase>?retryWrites=true&w=majority";

0

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

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

请确保将/admin部分更新为您要连接的数据库。


嗨,Nick,谢谢你的回答。我使用这种连接方式连接到mongodb Atlas:mongodb+srv://root:<password>@cluster0-zfgku.mongodb.net/test?retryWrites=true。我可以添加用户,但没有会话ID,这很奇怪。也许是"connect-mongo"库出了问题? - cessother
如果您可以访问数据库以保存用户,则连接正常。我认为您的问题与未将Mongoose连接传递到会话有关。我认为您可能需要考虑重用连接。请查看此处的“重用Mongoose连接”部分:https://www.npmjs.com/package/connect-mongo - Borduhh

0

这个错误是因为你正在传递一个 mongo-connect 不知道如何处理的 URL。你可以传递 mongoose.Connection 对象,然后在 MongoStore 选项对象中使用 mongooseConnection 属性,而不是 URL。

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');
    }
});

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


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