2013-05-14 22 views
8

Có cách nào để tôi có thể thay đổi đầu ra lỗi mặc định không? Giả sử tôi sẽ thay đổi sản lượng lỗi còn lại:Cách thay đổi đầu ra lỗi mặc định trong việc khôi phục

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

tới:

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

Dưới đây là một số ý tưởng của tôi:

  • Nghe các sự kiện lỗi.
    Dường như không phải tất cả RestError đều phát ra các sự kiện phụ (như NotFound, MethodNotAllowed, VersionNotAllowed ... do). Vì vậy, tôi không thể bắt tất cả các lỗi để viết lại chúng.

  • Nghe sự kiện trước khi gửi dữ liệu phản hồi.
    Tôi xem qua các tài liệu chính thức và không tìm thấy gì tương đối.

  • Sửa đổi triển khai lớp RestError.
    Rõ ràng đây không phải là cách tiếp cận tốt.

Có ý tưởng nào khác không?

Trả lời

3

Restify cung cấp nhiều cách để thực hiện quản lý lỗi: http://mcavage.github.io/node-restify/#Error-handling

Tại sao bạn không tạo ra một loại lỗi mới "myError" giống như mẫu mã:

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); 

Đối với các lỗi thường gặp Tôi nghĩ rằng quá tải phương pháp không phải là một ý tưởng tồi ... (Tôi không nói về sửa đổi phục hồi, chỉ cần quá tải chức năng sử dụng nguyên mẫu)

(edited)

+0

Mở rộng RestError để tạo Loại Lỗi mới sẽ không giúp khắc phục sự cố của tôi. Có lẽ tôi sẽ thử các chức năng quá tải bằng prototype.Thanks! –

+0

Sau rất nhiều nghiên cứu và một số kinh nghiệm với việc khôi phục, tôi sẽ cung cấp cho nó một đi như mangling với formatters có vẻ một chút nhiều nâng. –

11

Cuối cùng tôi cung cấp một định dạng JSON tùy chỉnh để có được những gì tôi muốn:

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; 
     } 
    } 
}); 
+0

Điều này làm việc hoàn hảo. Cảm ơn nhiều! –

1

tôi đã có thể cung cấp thêm dữ liệu thêm một tài sản cho đối tượng cơ thể. Thông báo các this.body.errors = errors dòng

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); 
` 
5

Trong khi các câu trả lời ở trên có thể làm việc, cách dễ nhất để thêm một lĩnh vực tùy chỉnh để cơ thể lỗi là để gọi constructor lỗi restify với một đối tượng (băm) thay vì một chuỗi. Đối tượng phải chứa khóa body là những gì bạn sẽ thấy trong trình duyệt.

Ví dụ:

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

hoặc

return next(new restify.UnauthorizedError({body: {foo: 'bar', name: 'john doe', message: 'whatever error message'}})); 
0

Bạn có thể sử dụng restify-errors-options

dụ của bạn chỉ đơn giản là trở thành:

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'} 

hãy cũng lưu ý t mũ giải pháp được cung cấp chỉ được thử nghiệm trên restify 5.x

Làm theo số issue để biết thêm thông tin.