NodeJs http状态异常处理

时间:2017-02-16 17:15:03

标签: node.js express exception-handling

我创建了nodejs + express应用程序。现在在我的应用程序中,异常捕获错误发送如下

app.get('/data', (req, res) => {
      if(!req.params.token){
        return res.status(403).send('Access token not provided');
      }

      //do something here
    });

不是发送 res.status(403).send('未提供访问令牌'); 可以发送类似的内容

exception.js

class Forbidden {
    constructor(message,stack = null){
        this.code = 403;
        this.message = message
        this.stack = stack;
    }
}

app.js

var httpForbidden = require('exception.js');

app.get('/data', (req, res) => {
if(!req.params.token){
    return new httpForbidden ('Access token not provided');
}

//do something here
});

而且我怎样才能在一次地方发现所有异常?

4 个答案:

答案 0 :(得分:4)

您可以使用以下内容:

class httpError {}

class httpForbidden extends httpError {
  constructor(message, stack = null) {
    super();
    this.code = 403;
    this.message = message
    this.stack = stack;
  }
}

app.get('/', (req, res) => {
  if (!req.params.token) {
    throw new httpForbidden('Access token not provided');
  }
  ...
});

app.use((err, req, res, next) => {
  if (err instanceof httpError) {
    return res.status(err.code).send(err.message);
  }
  res.sendStatus(500);
});

这使用Express error handling middleware来检查抛出的错误是否是httpError的实例(这将是您要创建的所有HTTP错误类的超类)如果是这样,将根据代码和消息生成特定响应(否则生成通用500错误响应)。

答案 1 :(得分:2)

我喜欢创建一个单独的函数,以及其他实用程序函数(比如在 lib.js 中),它创建一个格式正确的JSON响应对象,并选择适当的记录器来记录响应,具体取决于HTTP状态代码。

lib.js

var logger = require("./loggger");

module.exports.sendResponse = function (res,code,message,data) {

    if(code<100 || code>599) {
        throw new Error("response cannot be sent. Invalid http-code was provided.");
    }
    var responseLogger = code>=500 ? logger.error : logger.debug;

    var responseObject = {
        "code" : code,
        "message" : message
    };

    if(data) {
        responseObject.data = data;
    }

    responseLogger(responseObject);

    res.status(code).json(responseObject);
};

app.js

var lib = require("./lib");

/*
Relevant Express server code
 */
app.get('/data', function (req,res) {

    if(!req.params.token){
        return lib.sendResponse(res,403,"Access token not provided");
    }

    // Rest of business logic
});

注意:您可以编写自己的日志记录功能,但我强烈建议您在winston)等标准日志记录库上构建它

答案 2 :(得分:0)

您可以使用:

res.code(403).json({message: '...', stack: '...'});

并发送您想要的任何内容。但是你通过在响应对象上调用方法来做到这一点。

  

而且我怎样才能在一次地方发现所有异常?

非常糟糕的主意。你应该处理它们发生的所有错误,这样你仍然可以有一些上下文以合理的方式处理它们。否则你可以抛出异常并返回500个错误。

答案 3 :(得分:0)

You can use boom library instead, which provides a set of utilities for returning HTTP errors

HTTP 4xx Errors

Boom.badRequest([message], [data])

Boom.unauthorized([message],[scheme], [attributes])

HTTP 5xx Errors

Boom.badImplementation([message], [data]) - (alias: internal)

Boom.notImplemented([message], [data])

for more api documentation visit here