![](/img/trans.png)
[英]How to fix 'ERROR _HTTP_INVALID_STATUS_CODE' in Node?
[英]How to return HTTP error status code in Node?
在 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);
您可以为此创建自己的错误 class 。 我在几个项目上做过类似的事情:
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'));
恕我直言,这使代码更具可读性,并使错误代码在源代码中自我记录。
在 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'');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.