如何在Node中返回HTTP错误状态码?

10
什么是JavaScript / NodeJS中返回错误编号或错误状态码的最有效方法?例如,我想在以下片段中返回401状态码(或错误代码):
var login = function (params, callback) {

    var email       = params.email || '',
        password    = params.password || '';

    if (!isValidEmail(email)) { 
        return callback(new Error('Email address required', 401)); 
    }

    // Do something else
};

上面的登录方法将按以下方式调用:
authRouter.post('/login', function(req, res) {
   svc.login(req.body, function (err, response) {
       if (err) {
           err.statusCode = err.statusCode || 401;
           return res.status(err.statusCode).send({ message: err.message });
       } else {
           return res.send(response);
       }
   });
});

这里的目标是在方法中设置err.statusCode(或类似项),并通过回调函数传递回来。基本上,我正在寻找以下缩写版本:

var err = new Error('Email address required');
err.statusCode = 401;
return callback(err);

你的意思是发送给客户端吗?你使用的框架是什么? - Bergi
使用Node...我做什么都无所谓,我只想让错误对象包含数字值。 - G. Deward
1
如果这是问题,只需使用一个辅助函数 function StatusError(stat, msg) { var err = new Error(msg); err.statusCode = stat; return err; } 即可。 - Bergi
2个回答

6

您可以为此类问题创建自己的错误类。我在多个项目中都做过类似的事情:

class HttpError extends Error {
    constructor (message, statusCode) {
        super(message);
        this.statusCode = statusCode;
    }
}

现在您可以按照预期的方式使用它:

return callback(new HttpError('Email address required', 401)); 

个人喜欢为应用程序中出现的错误种类创建不同的错误类型,以使代码更易读。当你匆忙时,特别是如果你有初级开发人员在你的代码上工作时,你会发现大多数人不记得401错误代表什么。我通常做这样的事情:

class UnauthorizedError extends Error {
    constructor (message) {
        super(message);
        this.statusCode = 401;
    }
}

class ForbiddenError extends Error {
    constructor (message) {
        super(message);
        this.statusCode = 403;
    }
}

class NotFoundError extends Error {
    constructor (message) {
        super(message);
        this.statusCode = 404;
    }
}

那么我会这样使用它们:

return callback(new UnauthorizedError('Email address required'));

在我看来,这样做可以使代码更容易阅读,并且在源代码中自动记录错误代码。


-1
在NodeJS中,你应该将错误作为回调函数的第一个参数返回。
myFunctionThatDoesSomethingAsync (callback) {
  doSomethingAsync('asanas', function (){
    //do something 
    return callback(err,results)
  })
}

myFunctionThatDoesSomethingAsync(function (err,results) {
  if (!err)
    doSomethingWith(results)
})

阅读更多:http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/

抱歉,我再次阅读了您的问题,并使用NodeJS HTTP响应,您应该这样做:

res.writeHead(401, {'Content-Type': 'text/plain'});
res.end('Email address required'');

6
不是这个问题。我的目标是在错误对象上包含数字值(状态码)。 - G. Deward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接