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