【发布时间】:2020-07-31 09:50:27
【问题描述】:
所以我有这段代码可以正常工作,但如果数据类型有错误,try catch 块将无法正常工作。看来我必须在使用它们之前检查所有数据类型,以确保我的服务器不会崩溃。
例如在下面的代码中,如果由于某种原因令牌不是数组,则当错误 get 被抛出时,我的 try catch 没有捕获错误。相反,它正在使服务器崩溃。
router.patch("/updateDeviceToken", checkIfAuthenticated, (req, res) => {
try {
console.log("In updating contacts");
console.log("body", req.body);
User.findById(req.authId, (error, user) => {
try {
if (error) {
console.log(error);
console.log("user found");
return res.status(404).json(error);
}
if (!user) return res.status(401).json("User not found");
if (
req.body.android &&
!user.tokens.android.includes(req.body.android)
) {
user.tokens.android.push(req.body.android);
user
.save()
.then((user) => {
console.log("token updated");
return res.json("Token updated");
})
.catch((error) => res.status(404).json(error));
} else if (req.body.iOS && !user.tokens.iOS.includes(req.body.iOS)) {
user.tokens.iOS.push(req.body.iOS);
user
.save()
.then((user) => {
console.log("token updated");
return res.json("Token updated");
})
.catch((error) => res.status(404).json(error));
} else {
console.log("token received but not updated");
return res.json("Token received but not updated");
}
} catch (e) {
console.log(e);
return res.status(404).json("There was an error");
}
});
} catch (e) {
console.log(e);
}
});
【问题讨论】:
-
我不认为
404是您想要在服务器错误时返回的响应代码。您应该选择 5xx 响应代码。无论如何,在最外面的 catch 块中设置res.status是否有意义? -
您确定问题出在此处而不是在 checkIfAuthenticated 中间件中。你的 try/catch 应该可以处理几乎所有类型的错误。
-
我是的,控制台错误只是发生在数据库中的数据类型方面。 checkifauthenticated 只是我编写的一种用于解码用户令牌并验证身份验证的方法。
标签: javascript node.js express error-handling try-catch