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: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返回错误:错误:未授权客户端