簡體   English   中英

如何在Express 4.x中使用錯誤處理程序中間件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM