簡體   English   中英

如何在Node中返回HTTP錯誤狀態碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM