我已经编写了一些MEAN Stack应用程序并设置了API,但我总是在混淆上有一些关于处理API路径内错误的最佳方法。
如果我解释错误或者我的思想/概念存在缺陷,请纠正我。我在解释我认为是对的。只是想成为一名更好的程序员。
当我说错误时,我指的是以下情况:
一般错误,您未预测到的事情已经发生并且需要处理,可能服务器已关闭或服务器过载,基本上任何我们无法预测可能发生的事情。这种类型的错误主要在这里处理“我认为”( 请参阅以下代码 中的评论):
app.get('/user', isLoggedIn, function(req, res){
User.find(_id, function(err, user){
// HERE I am not sure how to handle this, Maybe we can't reach the DB or anything else could have happened. How do you handle this error so no matter what kind of error it is we can handle it gracefully and the app doesnt crash and we don't lose value data and the user is made aware of the issue.
if(err)
我已经看到人们如何管理上述错误的方法有以下几种:
if(err)
// I think this is wrong! Maybe okay for development but not for deployment
console.log("The Error is " + err);
if(err)
// Again I think not a good way of handling error because doesn't provide the system or the front-end user with any useful data.
throw err;
if(err)
// Not Sure
res.send(err);
if(err)
res.json(err);
所以上面是我们无法预测何种类型或何时可能出现错误但还有另一种类型见下文
所以我们说我们通过了上面的if(err)
阶段并转到了else
,这是我们可以预测错误的地方,因为这是用户互动发挥作用的地方。例如,继续上面的示例(查看代码中的注释):
app.get('/user',isLoggedIn,function(req, res) {
User.find(_id, function(err, user) {
if (err){
// NOT SURE WHAT TO DO HERE
}
// HERE lets say the user we are trying to get does not exist, now this is something we can predict, how to handle this not only gracefully so we don't crash the app but also provide the front end user with some useful information.
else if(!user){
}
else if(user){//Do what you were meant to do!}
});
})
现在我通常如何管理这种类型的错误是通过向前端用户发回一些信息,如下所示:
return(res.json({message: "The user you are trying to find does not exist, contact the system admin please."}));
我发回一些JSON数据并在div或警告框等内的前端显示。
所以这些是我所处理的错误的两种“种类”或更好的“情况”。什么是处理它们的最佳方式,以便应用程序可以自行管理而不会崩溃,但也确保前端用户知道最新情况,以便他们知道下一步。处理API中的错误的最佳做法是什么。
答案 0 :(得分:1)
我更喜欢使用next
和custom Error
Next
app.get('/user', isLoggedIn, function(req, res, next){
User.find(_id, function(err, user){
if (err)
return next(err); // Forwarding error to error-middleware
...or...
throw new Error('Cause'); // If error is critical for app and app must be stopped
...
});
在错误中间件中,我们可以选择向控制台/用户发送多少信息以及如何显示当前信息
// Detect current environment
if (req.app.get('env') != 'development') {
...
}
// Detect request type
if (req.xhr)
req.json(...)
else
res.render('error.html', ...);
Custom Error
在上面的示例中,您可以抛出AuthorizeError并通过next
转发它。有关custom error
阅读here的更多信息。 Imho对于小型应用来说过分了。