繁体   English   中英

你如何正确地停止执行 express.js 端点?

[英]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" });
    }
}

第二:你需要仔细观察你的异步逻辑。

你不能:

  1. 触发一些异步的东西
  2. 发送回复
  3. 当异步 function 完成时发送不同的响应

您只能对一个请求发送一个响应。

任何一个:

  • 不要在catch块中调用nextres.something ,只在内部记录错误
  • 不要在 promise 处理之外调用nextres.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM