![](/img/trans.png)
[英]How do I stop execution in Express.js after catching an error from an Await call?
[英]How do you properly stop execution of an express.js endpoint?
我有一个运行良好的中间件错误处理程序,但 next(err) 和 return 和 return next(err) 在处理承诺时似乎不会停止执行。 发现错误时停止执行代码的正确方法是什么?
供参考:在这种情况下,err 是标准错误 class。
我认为您不需要 userProvider.fetchFriends 中的代码来帮助解决此问题,但如果那是错误的,请告诉我。
const uid = req.query.steamUserId;
//Use the userProvider to get steam friend data
const friendData = await userProvider.fetchFriends(uid)
.catch(err => {
return next(err); //Does not stop execution. Why? just next(err) doesn't either.
});
//Putting this after every catch works but seems very stupid. How do I avoid this?
if(res.writableEnded)
return;
...Other code that runs but causes errors
}
你这里有两个问题。
首先: next()
明确地继续到下一个中间件或端点。
要完成对请求的处理,请发送响应。
const middleware = (req, res, next) => {
if (something(req)) {
next();
} else {
res.status(500).json({ ok: false, msg: "some error message" });
}
}
第二:你需要仔细观察你的异步逻辑。
你不能:
您只能对一个请求发送一个响应。
任何一个:
catch
块中调用next
或res.something
,只在内部记录错误或next
或res.something
并将其移至then
处理程序(您可能想切换到使用async
/ await
以使您的逻辑更容易理解)问题是我将 async/await 与.then/.catch 混合在一起。 需要使用 try/catch。
泰@jonsharpe
export const getSteamFriends = async (req, res, next) => {
try{
const uid = req.query.steamUserId;
//Use the userProvider to get steam friend data
const friendData = await userProvider.fetchFriends(uid);
//more code in the middle
} catch(e) {
return next(e);
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.