11

有什么方法可以更改默认错误输出?假设我要更改其余错误输出:

{
    "code": "InvalidArgumentError",
    "message": "blah blah..."
}

至:

{
    "code": 10001,
    "message": "blah blah",
    "extraMsg": "blah blah"
}

以下是我的一些想法:

  • 监听错误事件。
    似乎并非所有 RestError 都发出了额外的事件(如 NotFound、MethodNotAllowed、VersionNotAllowed ......做)。所以我无法捕获所有错误来重写它们。

  • 在发送响应数据之前监听事件。
    我浏览了官方文件,没有发现任何相关的东西。

  • 修改 RestError 类的实现。
    好吧,这显然不是一个好方法。

还有其他想法吗?

4

5 回答 5

11

最后我提供了一个自定义的 JSON 格式化程序来得到我想要的:

var server = restify.createServer( {
    formatters: {
        'application/json': function customizedFormatJSON( req, res, body ) {
            // Copied from restify/lib/formatters/json.js

            if ( body instanceof Error ) {
                // snoop for RestError or HttpError, but don't rely on
                // instanceof
                res.statusCode = body.statusCode || 500;

                if ( body.body ) {
                    body = {
                        code: 10001,
                        scode: body.body.code,
                        msg: body.body.message
                    };
                } else {
                    body = {
                        code: 10001,
                        msg: body.message
                    };
                }
            } else if ( Buffer.isBuffer( body ) ) {
                body = body.toString( 'base64' );
            }

            var data = JSON.stringify( body );
            res.setHeader( 'Content-Length', Buffer.byteLength( data ) );

            return data;
        }
    }
} );
于 2013-05-20T08:38:11.200 回答
5

虽然上面的答案可能有效,但将自定义字段添加到错误正文的最简单方法是使用对象(哈希)而不是字符串调用 restify 错误构造函数。该对象必须包含body您将在浏览器中看到的键。

例如:

return next(new restify.InvalidArgumentError({body: {field: 'password', message: 'Password has to be at least 6 characters long'}}));

或者

return next(new restify.UnauthorizedError({body: {foo: 'bar', name: 'john doe', message: 'whatever error message'}}));
于 2015-04-21T13:46:27.910 回答
4

Restify 提供了许多实现错误管理的方法:http: //mcavage.github.io/node-restify/#Error-handling

为什么不创建一个新的错误类型“myError”,就像示例代码一样:

var restify = require('restify');
var util    = require('util');

function MyError(message) {
  restify.RestError.call(this, {
    restCode      : 'MyError',
    statusCode    : 418,
    message       : message,
    constructorOpt: MyError
  });  
  this.name = 'MyError';
}

util.inherits(MyError, restify.RestError);

对于常见错误我认为重载方法并不是一个坏主意......(我不说修改restify,只是使用原型重载函数)

(已编辑)

于 2013-05-15T09:04:04.487 回答
1

我能够提供额外的数据,将属性添加到 body 对象。注意this.body.errors = errors线

var restify = require('restify');
var util = require('util');

function ValidationError(message, errors) {
    restify.RestError.call(this, {
        restCode: 'ValidationError',
        statusCode: 400,
        message: message,
        constructorOpt: ValidationError
    });
    this.name = 'ValidationError';
    this.body.errors = errors; //<---
}

util.inherits(ValidationError, restify.RestError);
`
于 2014-12-29T18:58:14.250 回答
1

您可以使用restify-errors-options

您的示例简单地变为:

const restify = require('restify');
const errors = require('restify-errors');
const errorsOptions = require('restify-errors-options');

errorsOptions.add('extraMsg');
const err = new errors.BadRequestError({extraMsg: 'whatever you want'});

err.toJSON();
//=> {code: 'BadRequest', message: '', extraMsg: 'whatever you want'}

另请注意,提供的解决方案仅在restify 5.x

关注此问题以获取更多信息。

于 2017-08-06T08:58:56.597 回答