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控制台生成的真实连接字符串:- 登录Atlas控制台进入目标集群
- 点击「Connect」→「Connect your application」
- 复制生成的标准连接字符串,替换代码中对应内容,确保
name是数据库用户名,password是用户密码,xxx是集群地址后缀
验证数据库用户权限
确保使用的数据库用户拥有目标数据库的读写权限:- 进入Atlas控制台的「Database Access」页面
- 找到对应用户,点击「Edit」
- 检查权限是否包含
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
相关产品推荐
相关产品推荐

