亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你能解釋一下錯誤處理是如何與 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 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號