第一个.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" })
)})
答案 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