为了账号安全,请及时绑定邮箱和手机立即绑定

你能解释一下错误处理是如何与 Express 中间件一起工作的吗?

你能解释一下错误处理是如何与 Express 中间件一起工作的吗?

胡说叔叔 2021-12-23 19:29:59
我正在阅读一本名为“使用 Node.js 进行编程”的书。这是我不太明白的代码:https://github.com/JonathanWexler/get-programming-with-nodejs/tree/master/unit_2/lesson_12_capstone/finish/confetti_cuisine错误控制器.jsconst httpStatus = require("http-status-codes");exports.pageNotFoundError = (req, res) => {  let errorCode = httpStatus.NOT_FOUND;  res.status(errorCode);  res.render("error");};exports.internalServerError = (error, req, res, next) => {  let errorCode = httpStatus.INTERNAL_SERVER_ERROR;  console.log(`ERROR occurred: ${error.stack}`);  res.status(errorCode);  res.send(`${errorCode} | Sorry, our application is taking a nap!`);};主文件const express = require("express"),  app = express(),  homeController = require("./controllers/homeController"),  errorController = require("./controllers/errorController"),  layouts = require("express-ejs-layouts");app.set("view engine", "ejs");app.set("port", process.env.PORT || 3000);app.use(  express.urlencoded({    extended: false  }));app.use(express.json());app.use(layouts);app.use(express.static("public"));app.get("/", (req, res) => {  res.render("index");});app.get("/courses", homeController.showCourses);app.get("/contact", homeController.showSignUp);app.post("/contact", homeController.postedSignUpForm);app.use(errorController.pageNotFoundError);app.use(errorController.internalServerError);app.listen(app.get("port"), () => {  console.log(`Server running at http://localhost:${app.get("port")}`);});我的问题:Express 如何知道何时运行“pageNotFoundError”或“internalServerError”?是否是这样,如果有一个请求,由相应的路由render方法处理,中间件或其他地方的所有render或send方法都被忽略?这可能远非正确,但会发生这样的事情吗?
查看完整描述

2 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

当发生异常时,express 会在next()后台调用该函数。Next 调用后续的中间件函数。

当您的 HTTP 方法之一成功返回时,永远不会到达错误中间件函数。

您可以阅读此处了解更多详情。

编辑:

所以这有点棘手。pageNotFoundError 在抛出异常后实际上不会发生。相反,它是在没有任何 get/post 路由匹配之后遇到的。因此,如果对 '/nonexistent-path/*' 发出请求,则 next 将被调用,直到 pageNotFoundError 被命中。

但是,如果抛出实际异常,则不会调用 pageNotFoundError,因为它不接受错误作为其方法签名中的参数。只有 internalServerError 会被调用,因为它是唯一接受错误作为参数的中间件。


查看完整回答
反对 回复 2021-12-23
?
喵喔喔

TA贡献1735条经验 获得超5个赞

在 Express js 中,正如@Greg 所说,我们有next(). 简单地说,它就像一个开关盒,它检查路由并向该路由发出请求,但是如果没有建立pagenotfound路由,它会给你路由,如果它不可用,它会给你internalserverError路由。


查看完整回答
反对 回复 2021-12-23
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信