如何在express 4.x中使用errorhandler中间件

时间:2017-09-09 04:18:49

标签: node.js express middleware

我尝试使用中间件错误处理程序,但是不起作用,即使我设置了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中尝试过哪种选项,它仍然无法正常工作。 任何人都可以帮我检查任何设置是错误的吗?

1 个答案:

答案 0 :(得分:0)

在所有其他路线之后声明错误处理。 Express通过路径从上到下或从左到右移动(如果您想象所有代码在一行上)。

您可以通过在所有其他路线之后放置一个splat路线来利用它,如果没有其他确切的路线匹配,它将被激活。这就是你如何做错误404页。

这就是为什么你要建立这样的路线(如果你进入React编码,它将为你准备反应路由器的开关组件'):

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。我使用显式返回来防止在已经发送标题后发送标题的任何问题,并且因为异步函数返回promises,所以显式返回将解决它们。

我所有的路线通常都是这样的:

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的第一个位置获取第4个参数,其中包含传递给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定义了该值。