2013-04-26 96 views
0

我正在開發一個Node.js + Express。我的數據庫是Mongo,我使用Mongoose連接到這個數據庫。在貓鼬回調上拋出異常

我想拋出一個異常的貓鼬查詢回調是這樣的:

game.save(function (err) { 
    if (err) { 
    throw new app.exception.EntitySaveFailed(); 
    }   
}); 

,但是當我這樣做,節點服務器崩潰,並顯示該堆棧跟蹤:

[object Object] 
    at Promise.<anonymous> (/home/server/routes/api/game.js:219:17) 
    at Promise.<anonymous> (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
    at Promise.EventEmitter.emit (events.js:95:17) 
    at Promise.emit (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
    at Promise.fulfill (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 
    at Promise.resolve (/home/server/node_modules/mongoose/lib/promise.js:108:15) 
    at Promise.<anonymous> (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
    at Promise.EventEmitter.emit (events.js:95:17) 
    at Promise.emit (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
    at Promise.fulfill (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 
Forever detected script exited with code: 8 
Forever restarting script for 9389 time 
Listening on port 3000... 

當我在mongoose回調函數外拋出一個異常,所有工作正常。

回答

1

當您在node.js回調中引發異常時,它將轉到實際調用回調的代碼,而不是代碼的詞法範圍。在這種情況下,這意味着Promise庫會收到異常並使程序崩潰。這就是爲什麼通常通過第一個回調參數而不是異常來報告錯誤的原因。

+0

我試圖用例外的,而不是通過尋找參數傳遞信息爲可愛/可讀性代碼。謝謝! – 2013-04-28 18:53:21

1

您可以添加「下一步」函數的參數,可以這樣當你需要拋出一個異常,你可以做這樣的事情:

function saveGame(req, res, next) { 
    game.save(function (err) { 
    if (err) { 
     return next(new app.exception.EntitySaveFailed()); 
    }   
    }); 
}