Docker部署Mongo容器映射端口3535后Mongoose连接报Authentication failed错误
问题解决方法
1. 解决mongoose认证失败问题
你的认证错误根源是:通过MONGO_INITDB_ROOT_USERNAME、MONGO_INITDB_ROOT_PASSWORD创建的管理员账号,默认归属admin认证库,而你连接时直接指定目标库为user,mongoose默认会到user库中校验账号密码,自然找不到匹配的账号信息。
修改方案二选一即可:
- 方案1:修改连接字符串,新增authSource参数
将你的连接代码改为:
mongoose.connect('mongodb://admin:admin@localhost:3535/user?authSource=admin', {useNewUrlParser: true, useUnifiedTopology: true }).then(()=>{ console.log("connected to db"); })
- 方案2:在连接配置项中指定authSource
mongoose.connect('mongodb://admin:admin@localhost:3535/user', { useNewUrlParser: true, useUnifiedTopology: true, authSource: 'admin' }).then(()=>{ console.log("connected to db"); })
mongo-express可以正常连接的原因是它默认使用admin库作为认证源,不需要额外配置。
2. 空Schema对接现有集合的用法说明
空Schemanew mongoose.Schema({})的用法本身是合法的:默认空Schema会开启strict: false配置,允许读写集合中所有字段,不需要提前定义字段结构。
但你需要注意一个配置问题:mongoose默认会将模型名转为小写复数作为匹配的集合名,比如你定义的模型名为Humans,它默认会去找humans集合,而你创建的集合名为单数human,会出现集合不匹配的问题。
修正方法:定义模型时显式指定集合名,示例如下:
// 在你的models/humans.js文件中修改模型定义,第三个参数为实际的集合名 const humanSchema = new mongoose.Schema({}); module.exports.Humans = mongoose.model('Humans', humanSchema, 'human');
内容的提问来源于stack exchange,提问作者VAIBHAV JAIN
相关产品推荐
相关产品推荐

