您能否解释一下Express中间件如何处理错误?

时间:2019-11-11 19:51:04

标签: javascript node.js express

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

这是我不太了解的代码:

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

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")}`); }); 方法处理的请求,那么中间件或其他地方的所有renderrender方法都会被忽略?这可能很不正确,但是会发生这种情况吗?

2 个答案:

答案 0 :(得分:2)

发生异常时,express将在后台调用next()函数。接下来调用后续的中间件功能。

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

您可以阅读here了解更多详细信息。

编辑:

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

但是,如果引发实际异常,则不会调用pageNotFoundError,因为它在其方法签名中不接受错误作为参数。将仅调用internalServerError,因为它是唯一接受错误作为参数的中间件。

答案 1 :(得分:0)

在Express js中,如@Greg所说,我们有next()。简而言之,这就像一个交换箱,它检查路由并向该路由发出请求,但是如果未建立路由,它将为您提供pagenotfound路由,如果不可用,它将为您提供internalserverError路由。