有什么方法可以更改默认错误输出吗?说我要改变其余的错误输出:
{
"code": "InvalidArgumentError",
"message": "blah blah..."
}
为:
{
"code": 10001,
"message": "blah blah",
"extraMsg": "blah blah"
}
以下是我的一些想法:
收听错误事件 似乎并非所有RestError都发出了额外的事件(如NotFound,MethodNotAllowed,VersionNotAllowed ...... do)。所以我无法抓住所有错误来重写它们。
在发送响应数据之前收听事件 我查看了官方文件,发现没有任何亲戚。
修改RestError类的实现 嗯,这显然不是一个好方法。
还有其他想法吗?
答案 0 :(得分: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;
}
}
} );
答案 1 :(得分: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'}}));
答案 2 :(得分:3)
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,只是使用原型重载函数)
(编辑)的
答案 3 :(得分: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);
`
答案 4 :(得分:1)
你的例子变成了:
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
请按照此issue了解详情。