【问题标题】:Can't provoke MongoError - bad auth无法引发 MongoError - 身份验证错误
【发布时间】:2020-06-09 15:40:29
【问题描述】:

明确一点,我想要从 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)
...还是我做错了什么?

【问题讨论】:

    标签: mongodb express mongoose mongodb-atlas


    【解决方案1】:

    已知 issue 用于 Mongoose 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)
      });
    

    【讨论】:

    • 嗨,谢谢回答。我已经从 5.8.11 更新到 5.9.2,现在我得到 MongooseServerSelectionError bad auth Authentication failed 这是一个进步,我希望纠正错误。我不想在连接时使用.catch(),而是在应用程序中全局捕获未处理的错误。无论如何,当我测试它时抛出了同样的错误(捕获被拒绝的承诺),服务器超时。
    猜你喜欢
    • 2016-01-01
    • 2019-12-16
    • 1970-01-01
    • 2021-10-09
    • 2016-04-07
    • 2018-01-08
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多