мангуст - .catch не улавливает ошибку - PullRequest
0 голосов
/ 11 октября 2018

первый оператор .catch не перехватывает, потому что, если введен неправильный идентификатор_задачи, возвращаемое значение будет нулевым, а не ошибкой.Может кто-нибудь показать мне, как правильно обрабатывать эту ошибку?

 router.get("/tasks/:task_id", passport.authenticate('jwt', { session: false }), (req, res) => {
   (User.findById(req.user.id)
      .then(user => res.json(user.tasks.id(req.params.task_id)))
        .catch(err => res.status(404).send({ tasknotfound: "No matching task found" }))
    ).catch(err =>
      res.status(404).json({ usernotfound: "No user found" })
)})

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Трудно читать, но это работает, поиск поддокетов напрямую возвращает массив объектов, затем в операторе .then возвращает JSON первого объекта в массиве, таким образом, если идентификатор не существует, он будетна самом деле бросить ошибку, чтобы быть пойманным.

router.get("/tasks/:task_id", passport.authenticate('jwt', { session: false }), (req, res) => {
   (User.findOne({ "tasks._id": req.params.task_id }, { "tasks.$": 1 })
       .then(task =>res.json(task.tasks[0]))
       .catch(err => res.status(404).send({ tasknotfound: "No matching task found" }))
)
 .catch(err =>
      res.status(404).json({ usernotfound: "No user found" })
 )
})
0 голосов
/ 12 октября 2018

Итак, когда мы проходим этот маршрут, сначала мы используем наше промежуточное ПО для проверки подлинности на месте, не так ли?После этого у нас есть обратный вызов и т. Д. Итак, что я хотел бы сделать здесь (мы говорим об обработке ошибок), это создать массив ошибок эмпатии.После этого я делаю чеки.Здесь мы проверяем, есть ли в нашем reg.body имя пользователя и задача, а если чего-то не хватает, мы выдвигаем объект с пользовательскими сообщениями об ошибках.После этого мы проверяем, является ли массив ошибок больше 0, и если это так, мы отображаем эти ошибки.С другой стороны, если все прошло хорошо, мы хотим использовать эти данные, назначить их объекту, сохранить их в нашей БД, показать пользователю сообщение об успехе некоторых типов и потенциально перенаправить пользователя на соответствующий маршрут.,Task будет Mongoose model.Я использовал подход Express router, и это ensureAuthenticated - это просто название промежуточного программного обеспечения, которое я дал.Passport.js что ты используешь - это круто.Я написал это, следуя вашему коду и покажу, как я это сделаю.Sidenote: Я обычно использую connect-flash для отображения сообщений об успехе / ошибке.npm install connect-flash

 router.post('/', ensureAuthenticated, (req, res) => {

  let errors = [];

  if(!req.body.username){
    errors.push({text:'Please add a username'});
  }
  if(!req.body.task){
    errors.push({text:'Please add some tasks'});
  }

  if(errors.length > 0){
    res.render('/add', {
      errors: errors,
      title: req.body.username,
      details: req.body.tasks
    });
  } else {
    const newTask = {
      username: req.body.username,
      tasks: req.body.tasks,
      id: req.user.id
    }
    new Task(newTask)
      .save()
      .then(task => {
        req.flash('success_msg', 'Your task has been added');
        res.redirect('/tasks');
      })
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...