抛出错误代码'返回下一个(错误);'

时间:2016-07-18 18:40:43

标签: node.js express

如何使用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.

提前感谢您的时间。

2 个答案:

答案 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