gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:48:26 25 4
gpt4 key购买 nike

我正在阅读一本名为“Get Programming with Node.js”的书。

这是我不太明白的代码:

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

errorController.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!`);
};

ma​​in.js

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 方法处理,所有 rendersend中间件或其他地方的方法被忽略了?这可能远非正确,但这样的事情会发生吗?

最佳答案

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

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

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

编辑:

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

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

关于javascript - 你能解释一下错误处理是如何与 Express 中间件一起工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58807803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com