[英]how to use errorhandler middleware in express 4.x
我嘗試使用中間件錯誤處理程序,但即使設置了process.env.NODE_ENV ='development'
,也無法正常工作
下面是服務器代碼:
var express = require('express');
var app = express();
var errorhandler = require('errorhandler');
var notifier = require('node-notifier');
process.env.NODE_ENV = 'development'; //just purposely do this, see if it can work
if (process.env.NODE_ENV == 'developmet') {
app.use(errorhandler({ log: errorNotification }));
}
function errorNotification(err, str, req) {
var title = 'Error in' + req.method + '' + req.url;
notifier.notify({
title: title,
message: str
});
}
app.get('/', function (req, res, next) {
nonexist(); //the error is still captured Native node.js not errorhandler
res.send('this is home page!');
next();
});
app.listen(1338);
無論我在errorhandler中嘗試了哪種選項,它仍然無法正常工作。 誰能幫我檢查任何設置錯誤?
在所有其他路由之后聲明錯誤處理。 Express通過從上到下或從左到右的路線移動(如果您想象所有代碼都在一行上)。
您可以通過在所有其他路線之后放置splat路線來利用這一點,如果沒有其他確切的路線匹配,它將被激活。 這是執行錯誤404頁面的方法。
這就是為什么您要像這樣構建路由(如果您進入React編碼,這將為您准備React Router的“交換組件”):
GET /test/:slug
GET /test
GET /
這是一個splat路由的示例,然后是您的錯誤處理程序中間件:
// Try switching the order of these first two
app.get('/', async (req, res, next) => {
return res.status(200).send('test')
})
app.get('*', async (req, res, next) => {
return res.status(404).send('error 404') // res.render('error/404')
})
// ERRORS
app.use(async (err, req, res, next) => {
// if next() is called with a parameter, which can be anything,
// this middleware will fire
res.status(500).send('error 500') // res.render('error/500')
throw err
})
// Try replacing your default route with this now
app.get('/', async (req, res, next) => {
return next('Extreme detonations')
})
您不需要這里顯示的異步函數,但是按照慣例,我可以這樣做,所以我總是可以在那兒await
。 我使用顯式返回來防止在發送標頭后發送標頭的任何問題,並且由於異步函數返回了promise,因此顯式返回將解決它們。
我所有的路線通常如下所示:
app.get('/admin', async (req, res, next) => {
try {
if (!req.user) throw 'garbageUser'
const poop = await something()
return res.render('template', {
data: obj,
bonusData
})
} catch (e) {
if (e === 'garbageUser') {
log.add(`illegal: ${req.originalUrl} from ${sniffer.getClientIp(req)}`)
return res.render('403')
}
return next(e)
}
})
希望對您有幫助,並提供一些代碼進行取證分析。 Express錯誤處理程序中間件在第一個位置err
采用第四個參數,該參數包含傳遞給next()
的值。
在研究了此內容之后,請再次查看Express文檔,這將更加有意義:)
要回答您的問題:
var express = require('express');
var app = express();
// You can add these back now that you understand
// var errorhandler = require('errorhandler');
// var notifier = require('node-notifier');
function handleErrors(error) {
console.log('I'm telling your mom about this: ' + error);
}
app.get('/', function(req, res, next) {
return next('REALLY BAD');
return res.send('this is home page!');
});
// Remember, this must be after all your other routes
app.use(function(err, req, res, next) {
console.log('Problem occurred, we could put logic here...');
console.log('Error was: ' + err);
if (err === 'REALLY BAD') {
handleErrors(err);
}
next();
});
app.listen(1338);
嘗試將其注釋掉,然后return next('REALLY BAD');
並再次運行。 您應該看到“這是主頁!”。
當您不帶任何參數調用next()
時,Express會將其視為沒有錯誤。 如果您傳入任何值,例如next(err)
或next('Chicken tastes good')
,您將在錯誤處理中間件中看到用該值定義的err
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.