在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 錯誤處理
在 Express 中使用模板引擎
代理之后的 Express
使用中間件
數(shù)據(jù)庫集成
錯誤處理
調(diào)試 Express
路由
遷移到 Express 4

錯誤處理

錯誤處理

定義錯誤處理中間件和定義其他中間件一樣,除了需要 4 個參數(shù),而不是 3 個,其簽名如下 (err, req, res, next)

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

在其他 app.use() 和路由調(diào)用后,最后定義錯誤處理中間件,比如:

var bodyParser = require('body-parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(function(err, req, res, next) {
  // 業(yè)務(wù)邏輯
});

中間件返回的響應(yīng)是隨意的,可以響應(yīng)一個 HTML 錯誤頁面、一句簡單的話、一個 JSON 字符串,或者其他任何您想要的東西。

為了便于組織(更高級的框架),您可能會像定義常規(guī)中間件一樣,定義多個錯誤處理中間件。比如您想為使用 XHR 的請求定義一個,還想為沒有使用的定義一個,那么:

var bodyParser = require('body-parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

logErrors 將請求和錯誤信息寫入標準錯誤輸出、日志或類似服務(wù):

function logErrors(err, req, res, next) {
  console.error(err.stack);
  next(err);
}

clientErrorHandler 的定義如下(注意這里將錯誤直接傳給了 next):

function clientErrorHandler(err, req, res, next) {
  if (req.xhr) {
    res.status(500).send({ error: 'Something blew up!' });
  } else {
    next(err);
  }
}

errorHandler 能捕獲所有錯誤,其定義如下:

function errorHandler(err, req, res, next) {
  res.status(500);
  res.render('error', { error: err });
}

如果向 next() 傳入?yún)?shù)(除了 'route' 字符串),Express 會認為當前請求有錯誤的輸出,因此跳過后續(xù)其他非錯誤處理和路由/中間件函數(shù)。如果需做特殊處理,需要創(chuàng)建新的錯誤處理路由,如下節(jié)所示。

如果路由句柄有多個回調(diào)函數(shù),可使用 'route' 參數(shù)跳到下一個路由句柄。比如:

app.get('/a_route_behind_paywall', 
  function checkIfPaidSubscriber(req, res, next) {
    if(!req.user.hasPaid) { 
      // 繼續(xù)處理該請求
      next('route');
    }
  }, function getPaidContent(req, res, next) {
    PaidContent.find(function(err, doc) {
      if(err) return next(err);
      res.json(doc);
    });
  });

在這個例子中,句柄 getPaidContent 會被跳過,但 app 中為 /a_route_behind_paywall 定義的其他句柄則會繼續(xù)執(zhí)行。

next()next(err) 類似于 Promise.resolve()Promise.reject()。它們讓您可以向 Express 發(fā)信號,告訴它當前句柄執(zhí)行結(jié)束并且處于什么狀態(tài)。next(err) 會跳過后續(xù)句柄,除了那些用來處理錯誤的句柄。