我正在研究一本名为“使用Node.js进行编程”的书。
这是我不太了解的代码:
errorController.js
from django.contrib import admin
from .models import tasksx
class Tasksx_Admin(admin.modelAdmin):
# Add whatever fields you want to display in the admin
# in list_diplay tuple.
list_display = ('job_title', 'creator', 'skill_name', 'starting', 'current', 'description', 'target_date', )
# Register the Taskx_Admin class.
admin.site.register(tasksx, Taskx_Admin)
main.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!`);
};
我的问题:
Express如何知道何时运行“ pageNotFoundError”或“ internalServerError”?
是否存在这样的情况:如果存在由相应路由的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")}`);
});
方法处理的请求,那么中间件或其他地方的所有render
或render
方法都会被忽略?这可能很不正确,但是会发生这种情况吗?
答案 0 :(得分:2)
发生异常时,express将在后台调用next()
函数。接下来调用后续的中间件功能。
当您的HTTP方法之一成功返回时,永远不会达到错误的中间件功能。
您可以阅读here了解更多详细信息。
编辑:
所以这有点棘手。抛出异常后,pageNotFoundError实际上不会发生。而是在没有任何get / post路由匹配后遇到它。因此,如果对“ / nonexistent-path / *”进行了请求,则将调用next,直到命中pageNotFoundError。
但是,如果引发实际异常,则不会调用pageNotFoundError,因为它在其方法签名中不接受错误作为参数。将仅调用internalServerError,因为它是唯一接受错误作为参数的中间件。
答案 1 :(得分:0)
在Express js中,如@Greg所说,我们有next()
。简而言之,这就像一个交换箱,它检查路由并向该路由发出请求,但是如果未建立路由,它将为您提供pagenotfound
路由,如果不可用,它将为您提供internalserverError
路由。