无法引发 MongoError - 错误的身份验证
Can't provoke MongoError - bad auth
明确一点,我想从MongoDB Atlas 获取MongoError bad auth Authentication failed
。
这是关于错误的数据库密码,我正在尝试捕获该错误并采取相应措施。
这是我的连接方式:
mongoose
.connect(CRED, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
})
.then(() => {
console.log('connected to database');
});
我在这里捕获了 unhandledRejection 错误,应该捕获错误的身份验证:
process.on('unhandledRejection', err => {
console.log(err.name, err.message);
server.close(() => {
process.exit(1);
});
});
如果我输入正确的密码,一切正常,我已连接到数据库。
但是如果我输入错误的密码,等待 30 秒后我会得到:
MongooseTimeoutError Server selection timed out after 30000 ms
...这不应该像那样工作。
当应用程序连接到 MongoDB
时,我应该立即得到 MongoError (bad auth)
...还是我做错了什么?
已知 issue 适用于 Mongoose <=5.7.1,具有 useUnifiedTopology: true
选项。
将您的 Mongoose 更新到 5.9.2 以解决此问题。
对于新版本,Mongoose 正确地失败了:
MongooseServerSelectionError MongooseError [MongooseServerSelectionError]: Authentication failed.
at new MongooseServerSelectionError (D:\myapp\node_modules\mongoose\lib\error\serverSelection.js:22:11)
at NativeConnection.Connection.openUri (D:\myapp\node_modules\mongoose\lib\connection.js:808:32)
at Mongoose.connect (D:\myapp\node_modules\mongoose\lib\index.js:333:15)
at Object.<anonymous> (D:\myapp\app.js:46:10)
at Module._compile (internal/modules/cjs/loader.js:959:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
at Function.Module._load (internal/modules/cjs/loader.js:727:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
at internal/main/run_main_module.js:17:11 {
message: 'Authentication failed.',
name: 'MongooseServerSelectionError',
reason: TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map { 'localhost:27017' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
},
[Symbol(mongoErrorContextSymbol)]: {}
}
此外,将 .catch
子句添加到您的代码中
mongoose
.connect(CRED, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
})
.then(() => {
console.log('connected to database');
})
.catch(error => {
//MongooseServerSelectionError MongooseError [MongooseServerSelectionError]: Authentication failed
console.log("Error", error)
});
明确一点,我想从MongoDB Atlas 获取MongoError bad auth Authentication failed
。
这是关于错误的数据库密码,我正在尝试捕获该错误并采取相应措施。
这是我的连接方式:
mongoose
.connect(CRED, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
})
.then(() => {
console.log('connected to database');
});
我在这里捕获了 unhandledRejection 错误,应该捕获错误的身份验证:
process.on('unhandledRejection', err => {
console.log(err.name, err.message);
server.close(() => {
process.exit(1);
});
});
如果我输入正确的密码,一切正常,我已连接到数据库。
但是如果我输入错误的密码,等待 30 秒后我会得到:
MongooseTimeoutError Server selection timed out after 30000 ms
...这不应该像那样工作。
当应用程序连接到 MongoDB
时,我应该立即得到 MongoError (bad auth)
...还是我做错了什么?
已知 issue 适用于 Mongoose <=5.7.1,具有 useUnifiedTopology: true
选项。
将您的 Mongoose 更新到 5.9.2 以解决此问题。
对于新版本,Mongoose 正确地失败了:
MongooseServerSelectionError MongooseError [MongooseServerSelectionError]: Authentication failed.
at new MongooseServerSelectionError (D:\myapp\node_modules\mongoose\lib\error\serverSelection.js:22:11)
at NativeConnection.Connection.openUri (D:\myapp\node_modules\mongoose\lib\connection.js:808:32)
at Mongoose.connect (D:\myapp\node_modules\mongoose\lib\index.js:333:15)
at Object.<anonymous> (D:\myapp\app.js:46:10)
at Module._compile (internal/modules/cjs/loader.js:959:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
at Function.Module._load (internal/modules/cjs/loader.js:727:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
at internal/main/run_main_module.js:17:11 {
message: 'Authentication failed.',
name: 'MongooseServerSelectionError',
reason: TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map { 'localhost:27017' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
},
[Symbol(mongoErrorContextSymbol)]: {}
}
此外,将 .catch
子句添加到您的代码中
mongoose
.connect(CRED, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
})
.then(() => {
console.log('connected to database');
})
.catch(error => {
//MongooseServerSelectionError MongooseError [MongooseServerSelectionError]: Authentication failed
console.log("Error", error)
});