猿问

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

我正在阅读一本名为“使用 Node.js 进行编程”的书。


这是我不太明白的代码:


https://github.com/JonathanWexler/get-programming-with-nodejs/tree/master/unit_2/lesson_12_capstone/finish/confetti_cuisine


错误控制器.js


const 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方法都被忽略?这可能远非正确,但会发生这样的事情吗?


胡说叔叔
浏览 145回答 2
2回答

潇潇雨雨

当发生异常时,express 会在next()后台调用该函数。Next 调用后续的中间件函数。当您的 HTTP 方法之一成功返回时,永远不会到达错误中间件函数。您可以阅读此处了解更多详情。编辑:所以这有点棘手。pageNotFoundError 在抛出异常后实际上不会发生。相反,它是在没有任何 get/post 路由匹配之后遇到的。因此,如果对 '/nonexistent-path/*' 发出请求,则 next 将被调用,直到 pageNotFoundError 被命中。但是,如果抛出实际异常,则不会调用 pageNotFoundError,因为它不接受错误作为其方法签名中的参数。只有 internalServerError 会被调用,因为它是唯一接受错误作为参数的中间件。

喵喔喔

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

相关分类

JavaScript
我要回答