远程MongoDB执行insert命令遇Unauthorized(13)认证错误求助
解决MongoDB认证错误:command insert requires authentication
问题背景
已成功连接远程服务器,但调用API执行插入操作时出现认证错误,以下是相关代码、错误信息及尝试过的连接字符串:
Node.js + Mongoose 代码
const express = require("express"); const bodyParser = require("body-parser"); const mongoose = require("mongoose"); const Promise = require('bluebird'); Promise.promisifyAll(mongoose); const app = express(); mongoose.connect("mongodb://<Username>:<Password>@<RemoteHost>:<Port>/user") .then(function(){ console.log("Connected to database"); }) .catch(function(err){ console.log("Connection failed", err); }); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); app.use(express.static("public")); // 数据库Schema与模型定义 const userSchema = new mongoose.Schema({ role_id: {type:Number}, name:{ firstName:{type:String}, middleName: {type:String}, lastName: {type:String} }, contact:{ mobileNo:{type:Number}, mail_id:{ username:{type:String}, password:{type:String} } }, address: {type:String}, pincode: {type:Number}, city: {type:String}, state: {type:String} }); const User = mongoose.model("users",userSchema); // API接口定义 app.get("/getusers",function(req,res){ User.find(function(err,foundUsers){ if(err){ res.send(err); } else { res.send(foundUsers); } }); }); app.post("/getusers",function(req,res){ try { const newUser = new User({ role_id: req.body.role_id , name:{ firstName: req.body.name.firstName, middleName: req.body.name.middleName, lastName: req.body.name.lastName }, contact:{ mobileNo: req.body.contact.mobileNo, mail_id:{ username: req.body.contact.mail_id.username, password: req.body.contact.mail_id.password } }, address: req.body.address, pincode: req.body.pincode, city: req.body.city, state: req.body.state }); newUser.save(); } catch (error) { console.log(error); } })
错误信息
/Documents/mProject/node_modules/mongodb/lib/cmap/connection.js:207 callback(new error_1.MongoServerError(document)); ^ MongoServerError: command insert requires authentication at Connection.onMessage (/Documents/mProject/node_modules/mongodb/lib/cmap/connection.js:207:30) at MessageStream.<anonymous> (/Documents/mProject/node_modules/mongodb/lib/cmap/connection.js:60:60) at MessageStream.emit (node:events:513:28) at processIncomingData (/Documents/mProject/node_modules/mongodb/lib/cmap/message_stream.js:132:20) at MessageStream._write (/Documents/mProject/node_modules/mongodb/lib/cmap/message_stream.js:33:9) at writeOrBuffer (node:internal/streams/writable:391:12) at _write (node:internal/streams/writable:332:10) at MessageStream.Writable.write (node:internal/streams/writable:336:10) at Socket.ondata (node:internal/streams/readable:754:22) at Socket.emit (node:events:513:28) at addChunk (node:internal/streams/readable:315:12) at readableAddChunk (node:internal/streams/readable:289:9) at Socket.Readable.push (node:internal/streams/readable:228:10) at TCP.onStreamRead (node:internal/stream_base_commons:190:23) { ok: 0, code: 13, codeName: 'Unauthorized', [Symbol(errorLabels)]: Set(0) {} }
已尝试的连接字符串组合
mongoose.connect("mongodb://${Username}:${Password}@${RemoteHost}:${Port}/user")mongoose.connect("mongodb://${RemoteHost}:${Port}/user")mongoose.connect("mongodb://${RemoteHost}/user")mongoose.connect("mongodb://${Username}:${Password}@${RemoteHost}/user")mongoose.connect("mongodb+srv://${Username}:${Password}@${RemoteHost}:${Port}/user")mongoose.connect("mongodb+srv://${RemoteHost}:${Port}/user")mongoose.connect("mongodb+srv://${RemoteHost}/user")mongoose.connect("mongodb+srv://${Username}:${Password}@${RemoteHost}/user")
解决方案
1. 确认数据库用户权限
确保你的数据库用户拥有user数据库的读写权限,尤其是insert权限。权限范围不足是这类错误的常见原因。
可通过MongoDB Shell执行以下命令(需管理员权限):
use user db.grantRolesToUser("<你的用户名>", [{ role: "readWrite", db: "user" }])
2. 修正连接字符串的认证参数
- 标准MongoDB连接(非Atlas的srv格式):需明确指定认证数据库。如果用户在
user数据库下创建,添加authSource=user参数;若用户在admin数据库创建,则指定authSource=admin:mongoose.connect("mongodb://<Username>:<Password>@<RemoteHost>:<Port>/user?authSource=user") - MongoDB Atlas连接:直接复制Atlas控制台生成的官方
srv连接字符串,不要手动修改,官方字符串已包含正确的认证参数。
3. 处理密码中的特殊字符
如果密码包含@、:、/等特殊字符,必须进行URL编码,例如:
@→%40:→%3A/→%2F
否则连接字符串会被解析错误,导致认证失败。
4. 验证连接后的认证状态
在连接成功的回调中添加代码,确认当前用户的权限,排查是否使用了正确的用户:
mongoose.connect("mongodb://<Username>:<Password>@<RemoteHost>:<Port>/user?authSource=user") .then(async function(){ console.log("Connected to database"); // 查看当前用户角色权限 const db = mongoose.connection.db; const authStatus = await db.command({ connectionStatus: 1 }); console.log("当前用户角色:", authStatus.authInfo.authenticatedUserRoles); }) .catch(function(err){ console.log("Connection failed", err); });
5. 修复POST接口的异步处理问题
原POST接口中newUser.save()是异步操作,未处理Promise也未给客户端返回响应,修正后代码:
app.post("/getusers", async function(req,res){ try { const newUser = new User({ role_id: req.body.role_id , name:{ firstName: req.body.name.firstName, middleName: req.body.name.middleName, lastName: req.body.name.lastName }, contact:{ mobileNo: req.body.contact.mobileNo, mail_id:{ username: req.body.contact.mail_id.username, password: req.body.contact.mail_id.password } }, address: req.body.address, pincode: req.body.pincode, city: req.body.city, state: req.body.state }); await newUser.save(); res.status(201).send("用户创建成功"); } catch (error) { console.log(error); res.status(500).send("创建用户失败: " + error.message); } })
内容的提问来源于stack exchange,提问作者user20578603
相关产品推荐
相关产品推荐

