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

MongoServerError认证失败求助:Node.js连接MongoDB Atlas报错

问题描述

运行nodemon时终端抛出MongoDB认证失败错误:

MongoServerError: bad auth : authentication failed
    at Connection.onMessage (C:\Users\twinc\Desktop\230102\server\node_modules\mongodb\lib\cmap\connection.js:230:30)
    at MessageStream.<anonymous> (C:\Users\twinc\Desktop\230102\server\node_modules\mongodb\lib\cmap\connection.js:61:60)
    at MessageStream.emit (node:events:527:28)
    at processIncomingData (C:\Users\twinc\Desktop\230102\server\node_modules\mongodb\lib\cmap\message_stream.js:125:16)
    at MessageStream._write (C:\Users\twinc\Desktop\230102\server\node_modules\mongodb\lib\cmap\message_stream.js:33:9)
    at writeOrBuffer (node:internal/streams/writable:389:12)
    at _write (node:internal/streams/writable:330:10)
    at MessageStream.Writable.write (node:internal/streams/writable:334:10)
    at TLSSocket.ondata (node:internal/streams/readable:754:22)
    at TLSSocket.emit (node:events:527:28) {
  ok: 0,
  code: 8000,
  codeName: 'AtlasError',
  connectionGeneration: 0,
  [Symbol(errorLabels)]: Set(2) { 'HandshakeError', 'ResetPool' }

Postman调用/register接口返回:

{
    "success": false,
    "err": {}
}

相关代码文件

index.js

const express = require('express')
const app = express()
const port = 3000
const bodyParser = require('body-parser');
const { User } = require('./model/User');

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

const mongoose = require('mongoose')

mongoose.set("strictQuery", false);

mongoose.connect('mongodb+srv://name:password@cluster0.xxx.mongodb.net/myFirstDatabase', {
}).then(() => console.log('MongoDB Connected...'))
  .catch(arr => console.log(arr))

app.get('/', (req, res) => {
  res.send('Hello, Express!')
})

app.post('/register', (req, res) => {
  const user = new User(req.body);

  user.save((err, userInfo) => {
    if(err) return res.json({ success: false, err});
    return res.status(200).json({
      success: true,
    });
  });
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`)
})

User.js

const mongoose = require('mongoose');

const userSchema = mongoose.Schema({
    name: {
        type: String,
        maxLength: 50,
    },
    email: {
        type: String,
        trim: true,
        unique: 1,
    },
    password: {
        type: String,
        minLength: 50,
    },
    role: {
        type: Number,
        default: 0,
    },
    image: String,
    token: {
        type: String,
    },
    tokenExp: {
        type: Number,
    },
})

const User = mongoose.model('User', userSchema)

module.exports = { User }

期望接口返回:

{
    "success": true
}
解决方案

针对MongoDB认证失败及接口问题,按以下步骤修复:

  • 替换连接字符串占位信息
    代码中的连接字符串mongodb+srv://name:password@cluster0.xxx.mongodb.net/myFirstDatabase是模板内容,必须替换为MongoDB Atlas控制台生成的真实连接字符串:

    1. 登录Atlas控制台进入目标集群
    2. 点击「Connect」→「Connect your application」
    3. 复制生成的标准连接字符串,替换代码中对应内容,确保name是数据库用户名,password是用户密码,xxx是集群地址后缀
  • 验证数据库用户权限
    确保使用的数据库用户拥有目标数据库的读写权限:

    1. 进入Atlas控制台的「Database Access」页面
    2. 找到对应用户,点击「Edit」
    3. 检查权限是否包含readWrite或dbOwner,无则添加
  • 处理密码特殊字符
    如果密码包含@、:、/等特殊字符,需对其进行URL编码(如@替换为%40),避免连接字符串解析错误

  • 修复UserSchema密码验证规则
    当前password字段的minLength设为50,不符合常规密码长度要求,会导致用户保存失败。修改为合理值,比如6:

    password: {
        type: String,
        minLength: 6, // 调整此处数值
    },
    
  • 完善错误返回信息
    当前接口返回的err为空对象,不利于排查问题。修改user.save回调,返回完整错误信息:

    user.save((err, userInfo) => {
        if(err) return res.json({ success: false, err: err.message || err});
        return res.status(200).json({
            success: true,
        });
    });
    

内容的提问来源于stack exchange,提问作者JOO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:30:51