2016-12-27 33 views
7

因此,我使用express.js,並尋找與節點7使用異步/等待。有沒有辦法,我仍然可以捕獲錯誤,但擺脫try/catch塊?也許是一個函數包裝?我不知道這將如何實際執行該函數的代碼,並且還致電next(err)有沒有辦法將await/async try/catch塊包裝到每個函數中?

exports.index = async function(req, res, next) { 
    try { 
    let user = await User.findOne().exec(); 

    res.status(200).json(user); 
    } catch(err) { 
    next(err); 
    } 
} 

這樣的事情......?

function example() { 
    // Implements try/catch block and then handles error. 
} 

exports.index = async example(req, res, next) { 
    let user = await User.findOne().exec(); 
    res.status(200).json(user); 
} 

編輯:

更多的東西與此類似:

var wrapper = function(f) { 
    return function() { 
     try { 
      f.apply(this, arguments); 
     } catch(e) { 
      customErrorHandler(e) 
     } 
    } 
} 

這會在一定程度處理try/catch塊,但不工作:

exports.index = wrapper(async example(req, res, next) { 
    let user = await User.findOne().exec(); 
    res.status(200).json(user); 
}); 

Is there a way to add try-catch to every function in Javascript?爲非異步的例子。

+1

只需使用快遞,承諾 – Bergi

+1

你無法不使包裝功能部件是異步包裝一個的await。在這種情況下,爲什麼不使用'.then()'和'.catch()'。什麼是「等待」購買你。錯誤處理需要在那裏。你不能只希望它離開一些其他功能。 – jfriend00

+0

我正在尋找方法來消除它們可能需要分叉時的嵌套'then'語句。上面的代碼就是一個示例。 – Neverlax

回答

5

是的,你可以很容易地編寫異步功能,包裝,以及 - 只使用async/await

function wrapper(f) { 
    return async function() { 
//   ^^^^^ 
     try { 
      return await f.apply(this, arguments); 
//     ^^^^^ 
     } catch(e) { 
      customErrorHandler(e) 
     } 
    } 
} 

或者你在這個例子中是更適合於表達直接使用的承諾,像(尤其是與參數的數量):

function promiseWrapper(fn) { 
    return (req, res, next) => { 
     fn(req, res).catch(next); 
    }; 
} 
+0

這是行不通的。雖然,異步需要應用於返回的函數,而不是實際的包裝函數。你能做出這樣的編輯,以便我可以標記它是答案嗎?謝謝! – Neverlax

+0

哎呀,當然。感謝提示! – Bergi

+0

是的,它是一個箭頭函數,但一個普通的函數也可以工作。重要的是它們是正式聲明的參數,即'promiseWrapper(...).length == 3',它表示用來區分處理程序。 – Bergi

相關問題