使用Node.js服务器调用mLab时出现认证错误代码18求助
解决MongoDB Shell 3.6连接mLab 3.4数据库时的认证错误(代码18)
我之前碰到过一模一样的问题,当时折腾了好一会儿才搞明白——MongoDB 3.6及以上版本的shell默认使用SCRAM-SHA-256作为认证机制,但mLab上运行的3.4版本(尤其是用MMAPv1存储引擎的实例)并不支持这个新的认证方式,这就是你触发错误代码18的核心原因。
下面给你几个可行的解决方案,不管是用shell连接还是在Node.js代码里操作都适用:
1. 用MongoDB Shell连接时指定认证机制
直接在连接命令里加上--authenticationMechanism SCRAM-SHA-1参数,强制使用3.4版本支持的认证方式:
mongo mongodb://你的用户名:你的密码@mlab的主机地址:端口号/数据库名 --authenticationMechanism SCRAM-SHA-1
2. Node.js代码中配置认证机制
如果你用Mongoose:
在连接选项里明确指定authMechanism为SCRAM-SHA-1:
const mongoose = require('mongoose'); // 替换成你自己的mLab连接信息 const dbURI = 'mongodb://你的用户名:你的密码@mlab的主机地址:端口号/数据库名'; mongoose.connect(dbURI, { auth: { authMechanism: 'SCRAM-SHA-1' }, // 根据你的mongoose版本添加必要的兼容选项 useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('数据库连接成功!')) .catch(err => console.error('连接失败:', err));
如果你用原生MongoDB驱动:
同样在连接选项里添加authMechanism配置:
const MongoClient = require('mongodb').MongoClient; const uri = 'mongodb://你的用户名:你的密码@mlab的主机地址:端口号/数据库名'; MongoClient.connect(uri, { authMechanism: 'SCRAM-SHA-1', useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => { if (err) { console.error('连接出错:', err); return; } const db = client.db('数据库名'); console.log('成功连接到数据库'); // 在这里执行你的数据库操作... client.close(); });
额外需要确认的几点
- 别搞混了!你用的应该是数据库用户的用户名和密码,不是你登录mLab官网的账户密码,很多人在这里踩坑。
- 确保这个数据库用户被授予了对应数据库的访问权限(至少要有
read或readWrite权限)。 - 如果以上方法都不行,可以尝试把MongoDB Shell降级到3.4.x版本,不过指定认证机制的方式更简单,不用折腾降级。
内容的提问来源于stack exchange,提问作者keser
相关产品推荐
相关产品推荐

