猫鼬-.catch无法捕获错误

时间:2018-10-11 20:53:46

标签: mongoose

第一个.catch语句不会捕获,因为如果输入了错误的task_id,则返回值为null而不是错误。有人可以告诉我如何正确处理此错误吗?

 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 :(得分:1)

因此,当我们沿这条路线走时,首先我们使用中间件来确保身份验证正确,对吗?在那之后,我们有了回调,等等。 因此,我想在这里做的(我们正在谈论错误处理)是制作一个移情错误数组。之后,我会进行检查。在这里,我们正在检查reg.body中是否存在用户名和任务,以及是否缺少某些内容,我们使用自定义错误消息推送对象。之后,我们检查errors数组是否大于0,如果是,则渲染这些错误。另一方面,如果一切顺利,我们想要做的就是使用该数据,将其分配给一个对象,将其保存到我们的数据库中,向用户显示某种成功消息,并可能将用户重定向到适当的路线。 Task将是Mongoose model。我使用了Express router方法,而ensureAuthenticated只是我给的中间件名称。您使用的Passport.js很棒。我是按照您的代码编写的,并向您展示了我将如何做。旁注:我通常使用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');
      })
  }
});

答案 1 :(得分:0)

这很难理解,但是有效,搜索子文档直接返回对象数组,然后在watermelon语句中返回数组中第一个对象的JSON,如果id不存在,则以这种方式实际上会引发错误。

.then