だから私はexpress.jsを使用していて、ノード7でasync / awaitを使用することを検討しています。それでもエラーをキャッチできるが、try / catchブロックを取り除く方法はありますか?おそらく関数ラッパー?これが実際に関数のコードを実行し、を呼び出す方法がわかりませんnext(err)
。
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);
});
Javascriptのすべての関数にtry-catchを追加する方法はありますか?を参照してください。非同期でない例の場合。
はい、あなたは簡単にだけでなく、非同期機能のために、このようなラッパーを書くことができます-ちょうど使用をasync
/ await
:
function wrapper(f) {
return async function() {
// ^^^^^
try {
return await f.apply(this, arguments);
// ^^^^^
} catch(e) {
customErrorHandler(e)
}
}
}
または、この例のように、(特にパラメーターの数を使用して)表現するように調整されたpromiseを直接使用します。
function promiseWrapper(fn) {
return (req, res, next) => {
fn(req, res).catch(next);
};
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加