如何使用return next(err)语句指定错误代码,以便我可以在我的catch中间件中显示它?
var express = require('express');
var exphbs = require('express-handlebars');
var fs = require("fs");
var app = express();
app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');
app.get('/', function(req, res, next) {
// simulate 404 error
fs.readFile("foo.txt", "utf8", function(error, data) {
if(error) {
next(new Error('Aiiii caramba'));
}
});
});
/* Error Handling (gotta catch 'em all) */
app.use(function(err, req, res, next) {
res.status(err.status || 500)
.render('error', {
status: req.status,
error: err
});
});
app.listen(3000, function() {
console.log('Listening...');
})
Error对象不会接受错误代码的参数。 我还尝试在返回下一步之前设置响应状态......无济于事。
res.status(404); return next(err);
无论我做什么,我都会收到错误500.
提前感谢您的时间。
答案 0 :(得分:2)
Error
没有理由拥有status
属性。如果你需要它,你必须自己制作错误并让它继承自Error
。
在ES6中,可以按如下方式完成:
class NotFound extends Error {
constructor(message) {
super(message);
this.status = 404;
}
}
如果你坚持使用ES5,你可以使用节点提供的util
模块:
var util = require('util');
function NotFound(message) {
Error.call(this);
this.message = message;
this.status = 404;
}
util.inherits(NotFound, Error);
现在,您可以将自定义错误抛出为next(new NotFound('Aiiii caramba'));
。可以说,NotFound('Aiiii caramba')
以明确的方式表达了遇到的错误。
答案 1 :(得分:1)
问题在于中间件之后的错误处理:
/* Error Handling (gotta catch 'em all) */
app.use(function(err, req, res, next) {
res.status(err.status || 500)
.render('error', {
status: req.status,
error: err
});
});
你有一行:res.status(err.status || 500)
并且由于你的错误对象没有状态字段,因此总是分配给500