卸载重装Mongoose后遇MongoParseError:凭证需为含用户名密码的对象
解决Mongoose连接MongoDB Atlas的MongoParseError错误
错误原因
你遇到的MongoParseError: credentials must be an object with 'username' and 'password' properties错误,是因为你同时在连接URI里提供了用户名密码,又在options中指定了auth: { authSource: 'admin' }。Mongoose 6.x版本规定:当显式传递auth配置对象时,会忽略URI中的凭据信息,强制要求auth对象包含完整的username和password属性。
两种解决方案
方案一:移除options中的auth配置(推荐)
Atlas的用户默认存储在admin库,Mongoose会自动从URI解析凭据并使用正确的authSource,无需额外配置。修改后的代码如下:
const dbURI = "mongodb+srv://admin:mypass@cluster0.iujq0.mongodb.net/myApp?retryWrites=true&w=majority" const options = { useUnifiedTopology: true, useNewUrlParser: true, } mongoose.set('strictQuery', false); mongoose.connect(dbURI, options) .then(() => console.log('MongoDB Connected')) .catch(err => console.log(err))
方案二:在auth对象中补充完整凭据
如果一定要保留auth配置,需要在auth里填写用户名和密码,同时从URI中移除凭据部分:
const dbURI = "mongodb+srv://cluster0.iujq0.mongodb.net/myApp?retryWrites=true&w=majority" const options = { auth: { authSource: 'admin', username: 'admin', password: 'mypass' }, useUnifiedTopology: true, useNewUrlParser: true, } mongoose.set('strictQuery', false); mongoose.connect(dbURI, options) .then(() => console.log('MongoDB Connected')) .catch(err => console.log(err))
关于和Atlas文档冲突的说明
Atlas官方文档是针对MongoDB原生驱动编写的,而Mongoose作为封装层,在6.x版本对认证逻辑做了调整,导致和原生驱动的行为不一致——原生驱动会优先使用URI中的凭据,而Mongoose在显式指定auth对象时会忽略URI凭据。
内容的提问来源于stack exchange,提问作者Tichel
相关产品推荐
相关产品推荐

