2011-09-20 64 views
13

當使用有效的JSON創建POST請求時,bodyParser會正確解析POST請求的正文。不過,如果我提交了無效的JSON字符串作爲身體,我收到錯誤:在Express中捕獲非法JSON POST數據?

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

所以,看來身體解析器身體的解析過程中失敗。但是,我想趕上這個失敗並返回一個錯誤。我不確定我能做些什麼來抓住它,所以任何幫助,將不勝感激。謝謝。

回答

2

這是在connect.js bodyParser middleware。它做一個嘗試/捕捉,然後再打電話(錯誤)。您應該能夠捕獲此錯誤並使用app.error()回調鉤子處理額外的自定義代碼。 http://expressjs.com/guide.html#error-handling

+0

嘿,彼得,謝謝你的回覆。不幸的是,我已經嘗試過,但無濟於事。看起來好像app.error永遠不會被執行。我試過了:'app.error(function(err,req,res,next){console.log(「ERR」);});',但它沒有被執行。對於我的app.configure開發,我把它設置爲'app.use(express.errorHandler({dumpExceptions:true,showStack:true}));'。我正在運行節點0.4.9,連接1.7.1,並表達2.4.6。有任何想法嗎?再次感謝。 – naivedeveloper

+0

嘗試爲現在註釋掉express errorHandler,並在app.use路由配置完成後放置app.error調用。但除此之外,我不確定爲什麼'app.error'不會被調用。 –

+0

由於某些原因,使用express/connect時,JSON.parse不會拋出異常,這就是爲什麼您的錯誤處理程序不會觸發。我正在調查解決方法。 – timoxley

1

由於某些原因,使用express/connect時,JSON.parse不會拋出異常,這就是爲什麼您的錯誤處理程序不會觸發。

我已經logged an issue with express,找出發生了什麼事情,但在此期間,您可以使用此解決辦法:

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

更新:這個問題是不熟悉表達的作者,所以我想知道如果這是另一個導致它的圖書館。將不得不逐個拆除我的代碼以找出引入此行爲的位置。

+0

我發現問題與快遞無關。奇怪的。你能夠隔離你案例中的故障碼嗎? – naivedeveloper

+0

不是。仍然不知道 – timoxley

1

試着把你的

app.use(express.bodyParser()); app.use(express.errorHandler(...))

解決了它對我來說。

您也可以改編下面的代碼來管理錯誤

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必須高於app.use(app.router),不要緊相對位置錯誤處理程序爲Perki