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

G. *_*ard 6 javascript node.js

在 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
};
Run Code Online (Sandbox Code Playgroud)

上面的 login 方法将按如下方式调用:

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);
       }
   });
});
Run Code Online (Sandbox Code Playgroud)

这里的目标是err.statusCode在方法中设置(或类似的)并通过回调传回。基本上,我正在寻找这个的速记版本:

var err = new Error('Email address required');
err.statusCode = 401;
return callback(err);
Run Code Online (Sandbox Code Playgroud)

sle*_*man 6

您可以为此创建自己的错误类。我在几个项目上做了类似的事情:

class HttpError extends Error {
    constructor (message, statusCode) {
        super(message);
        this.statusCode = statusCode;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

return callback(new HttpError('Email address required', 401)); 
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我更喜欢为我的应用程序使用的错误类型创建单独的错误类型,以使代码更具可读性。当你很匆忙时,特别是如果你有初级开发人员在处理你的代码,你会发现大多数人不会记得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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我会这样使用它们:

return callback(new UnauthorizedError('Email address required'));
Run Code Online (Sandbox Code Playgroud)

恕我直言,这使代码更具可读性,并且还使错误代码在源代码中自我记录。


小智 -1

在 NodeJS 中,您应该在回调的第一个参数中返回错误。

myFunctionThatDoesSomethingAsync (callback) {
  doSomethingAsync('asanas', function (){
    //do something 
    return callback(err,results)
  })
}

myFunctionThatDoesSomethingAsync(function (err,results) {
  if (!err)
    doSomethingWith(results)
})
Run Code Online (Sandbox Code Playgroud)

阅读更多: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'');
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题。我的目标是在错误对象上包含一个数值(状态代码)。 (6认同)