2011-09-20 38 views
13

Khi tạo yêu cầu POST với JSON hợp lệ, bodyParser phân tích cú pháp nội dung của yêu cầu POST một cách chính xác. Tuy nhiên, nếu tôi gửi một chuỗi JSON không hợp lệ làm nội dung, tôi nhận được lỗi:Bắt dữ liệu JSON không hợp lệ trong Express?

SyntaxError: Unexpected token ILLEGAL 
at parse (native) 
at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15) 
... 

Vì vậy, có vẻ như trình phân tích cú pháp nội dung bị lỗi trong quá trình phân tích cú pháp nội dung. Tuy nhiên, tôi muốn bắt lỗi này và trả lại lỗi. Tôi không chắc chắn những gì tôi có thể làm để bắt nó, vì vậy bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.

Trả lời

2

Đây là trong số connect.js bodyParser middleware. Nó làm một thử/bắt và sau đó gọi tiếp theo (err). Bạn sẽ có thể bắt lỗi này và xử lý bằng mã tùy chỉnh bổ sung bằng cách sử dụng móc gọi lại app.error(). http://expressjs.com/guide.html#error-handling

+0

Hey Peter, cảm ơn vì đã trả lời. Thật không may, tôi đã cố gắng mà không có avail. Có vẻ như app.error chưa bao giờ được thực hiện. Tôi đã thử: 'app.error (function (err, req, res, next) {console.log (" ERR ");});', nhưng nó không được thực hiện. Đối với app.configure của tôi để phát triển, tôi đã thiết lập nó là 'app.use (express.errorHandler ({dumpExceptions: true, showStack: true}));'. Tôi đang chạy nút 0.4.9, kết nối 1.7.1 và thể hiện 2.4.6. Ý tưởng nào? Cảm ơn một lần nữa. – naivedeveloper

+0

Hãy thử nhận xét về lỗi hiện tạiHandler ngay bây giờ và chỉ cần thực hiện cuộc gọi app.error sau khi các tuyến ứng dụng của bạn được định cấu hình. Nhưng khác hơn là tôi không chắc chắn tại sao 'app.error' sẽ không được gọi. –

+0

Vì một số lý do, khi sử dụng express/connect, JSON.parse không ném ngoại lệ, đó là lý do tại sao trình xử lý lỗi của bạn không kích hoạt. Tôi đang điều tra một cách xung quanh điều này. – timoxley

1

Vì một số lý do, khi sử dụng express/connect, JSON.parse không ném ngoại lệ, đó là lý do tại sao trình xử lý lỗi của bạn không kích hoạt.

Tôi đã logged an issue with express để tìm hiểu những gì đang xảy ra, nhưng trong khi chờ đợi, bạn có thể sử dụng workaround này:

express.bodyParser.parse['application/json'] = function(data) { 
    var result = JSON.parse(data) 
    if (typeof result != 'object') { 
    throw new Error('Problems parsing JSON') 
    } 
    return result; 
} 
app.use(express.bodyParser()); 

update: vấn đề này là không quen thuộc với tác giả của nhanh, vì vậy tôi tự hỏi nếu đó là một thư viện khác gây ra nó. Sẽ phải tháo dỡ từng mảnh mã của tôi để tìm hiểu xem hành vi này đang được giới thiệu ở đâu.

+0

Tôi thấy rằng vấn đề không liên quan đến diễn đạt. Kỳ dị. Bạn có thể cách ly mã rắc rối trong trường hợp của bạn không? – naivedeveloper

+0

Không. Vẫn không có ý tưởng – timoxley

1

Hãy thử đặt

app.use (express.bodyParser()) của bạn; sau app.use (express.errorHandler (...))

giải quyết nó cho tôi.

Bạn cũng có thể thích nghi với đoạn mã sau để quản lý các lỗi

express.bodyParser.parse['application/json'] = function(req, options, fn){ 
    var buf = ''; 
    req.setEncoding('utf8'); 
    req.on('data', function(chunk){ buf += chunk }); 
    req.on('end', function(){ 
    try { 
    req.body = buf.length 
     ? JSON.parse(buf) 
     : {}; 
    fn(); 
    } catch (err){ 
    fn(new Error('Problems parsing JSON')); 
    } 
}); 
}; 
0

bodyParser phải trên app.use (app.router), nó không quan trọng vị trí tương đối lỗi xử lý như Perki

Các vấn đề liên quan