2017-04-07 45 views
0

這可能是非常愚蠢的,但我沒有找到太多關於這個,因爲我不明白我應該如何搜索這個。如何處理Express,NodeJS中路由處理程序調用的函數中的錯誤?

我有一個路由處理程序,可能會根據某些請求參數調用不同的函數,我想知道什麼是處理函數內部錯誤以便將錯誤傳遞到錯誤處理中間件的最佳方法。 考慮這樣的事情:

router.get('/error/:error_id', (req, res, next) => { 
    my_function(); 
} 

function my_function(){ 
    // do something async, like readfile 
    var f = fs.readFile("blablabla", function (err, data) { 
     // would want to deal with the error 
    }); 
} 
期間 fs.readFile

如果出現錯誤,我該如何傳遞錯誤next將其轉發到錯誤中間件?唯一的解決辦法是將下一個參數傳遞給功能函數my_function(next){...}

如果這個函數不調用任何異步I/O操作,在路由處理一個簡單的try/catch將是確定的(我想),像這樣:

router.get('/error/:error_id', (req, res, next) => { 
    try{ 
     my_function(); 
    } catch(e){ 
     next(e); 
    }; 
} 

function my_function(){ 
    // do stuff 
    var f = fs.readFileSync("blablabla"); // possibly throws an error 
} 

希望我做一些感覺。

回答

1

您完全正確,因爲fs.readFile是異步的,所以您應該將next回調傳遞到my_function

router.get('/error/:error_id', (req, res, next) => { 
    my_function(next); 
} 

function my_function(next) { 
    fs.readFile("blablabla", function (err, data) { 
    if (err) { 
     next(err); 
    } else { 
     // Process the data 
     // Don't forget to call `next` to send respond the client 
    } 
    }); 
} 

順便說一句,你不能這樣做

var f = fs.readFile(...) 

因爲fs.readFile是異步的。數據應該在回調中處理。

相關問題