You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程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) {}
}

已尝试的连接字符串组合

  1. mongoose.connect("mongodb://${Username}:${Password}@${RemoteHost}:${Port}/user")
  2. mongoose.connect("mongodb://${RemoteHost}:${Port}/user")
  3. mongoose.connect("mongodb://${RemoteHost}/user")
  4. mongoose.connect("mongodb://${Username}:${Password}@${RemoteHost}/user")
  5. mongoose.connect("mongodb+srv://${Username}:${Password}@${RemoteHost}:${Port}/user")
  6. mongoose.connect("mongodb+srv://${RemoteHost}:${Port}/user")
  7. mongoose.connect("mongodb+srv://${RemoteHost}/user")
  8. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:10:30