Javascript 如何正确处理Express中的错误?

Javascript 如何正确处理Express中的错误?,javascript,node.js,middleware,express,Javascript,Node.js,Middleware,Express,我开始使用Express JS,遇到了一个问题。我似乎想不出处理错误的正确方法 例如,我有一个web服务API,它为一个名为“事件”的对象提供服务。当用户提交未找到的事件id时,我想返回一个简单的字符串“找不到事件”。以下是我目前如何构建代码: app.get('/event/:id', function(req, res, next) { if (req.params.id != 1) { next(new Error('cannot find event ' + re

我开始使用Express JS,遇到了一个问题。我似乎想不出处理错误的正确方法

例如,我有一个web服务API,它为一个名为“事件”的对象提供服务。当用户提交未找到的事件id时,我想返回一个简单的字符串“找不到事件”。以下是我目前如何构建代码:

app.get('/event/:id', function(req, res, next) {
    if (req.params.id != 1) {
        next(new Error('cannot find event ' + req.params.id));
    }

    req.send('event found!');
});
当我提交除1以外的id时,节点崩溃,输出如下:

http.js:527
   throw new Error("Can't set headers after they are sent.");
         ^
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/usr/local/kayak/node_modules/express/node_modules/connect/lib/patch.js:62:20)
    at /usr/local/kayak/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js:72:19
    at [object Object].<anonymous> (fs.js:107:5)
    at [object Object].emit (events.js:61:17)
    at afterRead (fs.js:878:12)
    at wrapper (fs.js:245:17)
http.js:527 抛出新错误(“发送邮件后无法设置邮件头。”); ^ 错误:发送邮件后无法设置邮件头。 在服务器响应。是Express文档的一部分,但我无法理解它。

您将要签出。从那里:

app.param('userId', function(req, res, next, id) {
    User.get(id, function(err, user) {
        if (err) return next(err);
        if (!user) return next(new Error('failed to find user'));
        req.user = user;
        next();
    });
});

您缺少的最佳点是返回
下一个(…)
您的代码中有几个问题:

  • 响应客户机时,需要使用响应对象(
    res
    而不是
    req

  • 将错误发送到下一个
时,您应该返回
,这样函数的其余部分就不会运行

以下是修复这些错误后的代码:

app.get('/event/:id', function(req, res, next) {
    if (req.params.id != 1) {
        return next(new Error('cannot find event ' + req.params.id));
    }

    res.send('event found!'); // use res.send (NOT req.send)
}); 

这是因为您做得不对:您已经抛出了一个错误(将由Express处理,并为用户返回一个500错误页面或类似的内容),但您还试图向客户端发送自己的响应:res.send('event find!')

您应该在此处查看有关错误处理的快速指南:

在你的例子中,我要做的是:

function NotFound(msg){
  this.name = 'NotFound';
  Error.call(this, msg);
  Error.captureStackTrace(this, arguments.callee);
} 

app.get('/event/:id', function(req, res, next){
  if (req.params.id != 1) {
    throw new NotFound('Cannot find event ' + req.params.id);
  } else {
    res.send('event found!');
  }
});

app.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.render('404.ejs');
    } else {
        next(err);
    }
});

链接中的express文档非常糟糕。它甚至没有提到你应该如何正确地抛出一个错误,或者它对哪个版本的express是有效的。这是express 3.x的链接,如果你想了解更多关于2.x签出中的错误处理的信息,这个链接:哦,讽刺的是:答案中的错误处理程序链接返回一个GitHub 404。这是当前活动链接:它应该是res.send,而不是req.send