node.js - 如果中间件在 REST API 中失败,会有什么响应?

标签 node.js rest httprequest response req

我正在阅读包含两个文件的代码,如下所示:

第一个使用currentuser中间件的文件:

const router = express.Router();

router.get("/api/users/currentuser", currentUser, (req, res) => {
  res.send({ currentUser: req.currentUser || null });
});

export { router as currentUserRouter };

定义中间件的第二个文件:

interface UserPayload {
  id: string;
  email: string;
}

declare global {
  namespace Express {
    interface Request {
      currentUser?: UserPayload;
    }
  }
}

export const currentUser = (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  if (!req.session?.jwt) {
    return next();
  }

  try {
    const payload = jwt.verify(
      req.session.jwt,
      process.env.JWT_KEY!
    ) as UserPayload;
    req.currentUser = payload;
  } catch (err) {}

  next();
};

据我所知,如果有经过验证的 jwt token ,中间件将从其中取出有效负载并将其添加到 req 对象中。但是,如果失败并且无法将有效负载/当前用户添加到 req 中怎么办?以下请求会发生什么以及 res 对象会是什么样子?

router.get("/api/users/currentuser", currentUser, (req, res) => {
  res.send({ currentUser: req.currentUser || null });
});

您能否编辑此 get 请求以显示如果我不是中间件的编写者,我如何捕获可能的错误?

最佳答案

如果您有一个包罗万象的异常处理程序,并且您的中间件引发了异常,您将确定响应。

如果您的中间件抛出异常并且您没有捕获它,系统可能会退出该进程。

如果你的中间件没有抛出异常,没有调用 next(),也没有响应,请求就会挂起。

如果您的中间件返回响应,并且没有调用 next(),则您的发送函数将永远不会被调用。

最重要的是,您需要将响应转储到服务器上,并准确查看中间件如何处理此问题。

在我的大多数身份验证中间件中,我选择不调用 next(),并返回 403 错误。但是抛出异常,然后从包罗万象的处理程序返回 403 有一些好处。

关于node.js - 如果中间件在 REST API 中失败,会有什么响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74296861/

相关文章:

javascript - 准备部署express js应用程序,我应该担心哪些安全问题?

java - PreAuthorize ("isAuthenticated()") 不适用于 RestController

java - jersey http客户端自定义请求方式

c# - 寻找发送http请求的c#方法

Android令人沮丧的网络错误

javascript - 使用 if 语句条件的查询输入

javascript - 如何检查数组是否是 Javascript 中的空数组的数组

c# - HttpWebRequest WebException 协议(protocol)错误

arrays - 通过 Postman 发送 JSON 会导致我的 Node.js 服务出现错误

java - 将 json 对象中的日期发送到 Restful ws