Не могу спровоцировать MongoError - плохая аутентификация - PullRequest
2 голосов
/ 25 февраля 2020

Просто чтобы прояснить, я хочу получить MongoError bad auth Authentication failed из MongoDB Atlas.
Это из-за неправильного пароля БД, и я пытаюсь перехватить эту ошибку и действовать соответственно.

это мой метод подключения:

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 се c ожидания я получу:

MongooseTimeoutError Server selection timed out after 30000 ms

... и это не должно работать так.
Я должен получить MongoError (плохая аутентификация) сразу, с первой попытки, когда приложение подключается к MongoDB
... или я делаю что-то не так?

1 Ответ

1 голос
/ 26 февраля 2020

Известно выпуск для Пн goose <= 5.7.1 с опцией <code>useUnifiedTopology: true.

Обновите Mon goose до 5.9.2, чтобы исправить проблему.

В новой версии Mon goose завершается с ошибкой:

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)
  });
...