Node.js 使用';返回下一个(错误)';

Node.js 使用';返回下一个(错误)';,node.js,express,Node.js,Express,如何使用return-next(err)语句指定错误代码,以便在catch-all中间件中显示它 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 eng

如何使用return-next(err)语句指定错误代码,以便在catch-all中间件中显示它

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...');
})
错误对象不接受错误代码的参数。 我还尝试在返回下一步之前设置响应状态。。。无济于事

res.status(404); return next(err);
无论我做什么,我都会得到错误500


提前感谢您抽出时间。

没有理由让
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(newnotfound('Aiiii-caramba')。可以说,
NotFound('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
  });
});

这里有一行:
res.status(err.status | | | 500)
并且由于您的错误对象没有状态字段,如果您希望您的
error
对象具有
status
属性,它总是被分配到500

,那么,为什么不先在
错误
对象上设置
状态
属性,然后再将其传递到
下一个
?这就是你问题的答案吗?谢谢你。我明白为什么它会得到500。。。我应该更清楚一点:如何传递不同的错误代码?