【问题标题】:Node.js custom error handlingNode.js 自定义错误处理
【发布时间】:2015-01-22 14:34:39
【问题描述】:

我正在开发一个应用程序。在该应用程序中,我定义了一些自定义错误,如下所示

'use strict';

/**
 * Validation error.
 * The Default HTTP STATUS CODE for ValidationError is 400 (HTTP BAD REQUEST)
 *
 */

/* Globals */
var HTTP_BAD_REQUEST = 400;
var NAME = 'ValidationError';

/**
 * Constructor
 *
 * @param {String}      message       The validation error message
 */
function ValidationError(message) {
  this.name = NAME;
  this.message = message;
  this.code = HTTP_BAD_REQUEST;
}

ValidationError.prototype = new Error();

/**
 * Module exports
 */
module.exports = ValidationError;

现在我使用 require 将该模块导入到其他模块中,例如

var UnauthorizedError = require('../errors/UnauthorizedError')

在控制器中

// perform some logic
if(somecondition) {
    // call global error handler
    next(new ValidationError('id is must');
} else {
    // call next middleware
    next();
}

Enen if somecondition 为 false next() 正在调用错误处理程序中间件。

我定义了我的错误处理程序中间件,如下所示

var winston = require('winston');
var HTTP_INTERNAL_SERVER_ERROR = 500;
var MESSAGE = 'Internal Server Error';

/**
 * Express standard error middleware
 *
 * @param  {Error}      err     error object
 * @param  {Object}     req     express request object
 * @param  {Object}     res     express response object
 * @param  {Function}   next    express next function
 */
var middleware = function(err, req, res) {
  winston.error(err);
  res.status(err.code || HTTP_INTERNAL_SERVER_ERROR).json(err.message || MESSAGE);
};

/**
 * Module exports
 */
module.exports = function() {
  return middleware;
};

我在我的应用程序中使用 errorHandler,例如

app.use(errorHandler());

注意,在错误处理程序中,我正在向客户端发送带有一些状态代码和错误消息的 json 数据。但是,如果我签入邮递员,则响应标头是

Connection → keep-alive
Content-Length → 695
Content-Type → text/html; charset=utf-8
Date → Thu, 22 Jan 2015 14:18:13 GMT
X-Content-Type-Options → nosniff
X-Powered-By → Express

内容主体是错误的堆栈跟踪 我已经验证了 next with error 没有被调用并且 somecondition 是 false 并且 error Handler 中间件也没有被调用。

【问题讨论】:

  • 你能把剩下的中间件脚手架贴出来吗?

标签: javascript node.js rest


【解决方案1】:

我不想回答我自己的问题。但为了社区,我发布它。我希望它对任何人都有用。

下面的中间件声明

var middleware = function(err, req, res) {
  winston.error(err);
  res.status(err.code || HTTP_INTERNAL_SERVER_ERROR).json(err.message || MESSAGE);
};

错误中间件应该接受 4 个参数。

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2011-01-29
    • 2010-12-07
    • 1970-01-01
    • 2018-10-12
    • 2018-03-23
    • 2017-04-30
    • 2013-12-04
    • 2017-12-18
    相关资源
    最近更新 更多