Как контролировать ошибки mongoose, чтобы не показывать важную информацию в производстве?

Я стараюсь манипулировать ошибками в различных случаях с mongoose, и один из них например, если связь не устанавливается из-за верительных грамот (user, pass).

Нормальное состоит в том, чтобы, если верительные грамоты неправильные, он послал следующее сообщение:

(node:9272) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: Authentication failed.

Но то, что я хочу, состоит в том, чтобы показывать ошибку с простым сообщением, например: ' Ошибка DB', просто так.

Это мой код, где я стараюсь контролировать это событие:

function connect (callback){
  let uri = `mongodb://${wrong_user}:${wrong_pass}@${host}:${port}/${db}`
  mongoose.connect(uri, err => {
    callback(err, `Connected in ${config.host}/${config.port}`)
  })
}

И я это использую так:

connect ((err, uri) => {
  if (err)
    return new Error('Error DB')
  else
    console.log(uri)
})

И однако он продолжает показывать мне, что ошибка - удостоверение.

0
задан 08.01.2017, 21:03
2 ответа

Ошибки, которые ты был бы должен показывать, в первом месте, должны быть утверждения. Внутренние ошибки не должны быть выставленными клиенту, потому что этот не интересуют детали, кроме того, пользователи плохо умышленные могут использовать эта информацию, чтобы открывать бреши безопасности.

Ошибки утверждения я очень важен в системе, так как мы так показываем пользователю правила, которые он должен продолжать, когда данные пробуют сохраняться. У Mongoose есть иерархия errors, с MongoseError до ValidationError. Каждый сын внутри иерархии получает в наследство свойство errors, который является array сообщений ошибки.

Манипулируя ошибками на уровне базы данных

Проблема, которая у тебя есть, состоит в том, что ты возвращаешь ошибку внутри callback, что не добьется желанного эффекта. В Вашем месте, ты должен манипулировать ошибкой внутри callback и показывать ответ пользователь или что-то.

mongoose
  .connect(...)
  .then(() => {
    connected = true;
  })
  .catch(err => {
    connected = false;
  });

Если ты используешь Express или Koa, ты можешь делать middleware для того, чтобы он проверил связь в базу данных, и отвечать согласно ей:

app.use('*', (req, res, next) => {
  if (!connected) {
    return res.status(500).send("Couldn't stablish connection. Please, contact the admin");
  } else {
    return next();
  }
});

Таким образом, если мы делаем просьбу в любой унифицированный указатель ресурса системы, и произошла ошибка удостоверения с базой данных, мы получим вышеупомянутое сообщение, следуемое ошибкой 500 (interval server ошибка).

Манипулируя ошибками утверждения моделей

На уровень утверждения схем / моделей, единственное, что мы должны делать, он состоит в том, чтобы посылать сообщения errors, которые Mongoose разработал из-за нас согласно ограничениям в схемах. Например у нас есть следующая схема:

const UserSchema = new Schema({
  username: {
    type: Schema.Types.String,
    required: true,
    unique: true
  }
  ...
});

Если мы вводим один username дубликат, мы получим один ValidationError которым мы можем манипулировать:

User
  .save({ ... })
  .then((user) => {
    res.jsonp(user);
  })
  .catch(err => {
    res.jsonp({
      success: false,
      errors: err.errors
    });
  });
2
ответ дан 24.11.2019, 11:43

Если тебе нужно, чтобы aplicaciГіn он остановил ее ejecuciГіn вместо того, чтобы использовать return в ней funciГіn, - необходим throw:

throw new Error('Error DB');

Другая проблема состоит в том, что 'Ошибка DB' является совсем не описательной и в одной aplicaciГіn в производстве необходимо решать проблемы быстро.

Поэтому я рекомендую тебе использовать logger как winston или тот, которого ты предпочитаешь, и loggear например в файл. Всегда оставляя описательные ошибки не простой 'произошел здесь' или 'ошибка db'. 'DB Connection ошибка' например.

типов Привета

0
ответ дан 24.11.2019, 11:43
  • 1
    Спасибо за твой ответ :) В самом деле моя идея - что в producció n не показывайте informació n подробно описанная на ошибках, так как это может быть informació n использованная против системы, но ты дал мне мысль показывать общее сообщение ошибки и одновременно сохранять деталь в файле log (в producció n, в стадии строительства очевидный sí показывать весь info) – J.Correa 11.01.2017, 16:42