node端末統一エラー処理
1750 ワード
起因
前のプロジェクトでは、各コントローラは大体このように書かれています.
転換する
今は開発があったとしたら、何十個かのコントローラを書いて、try catchを入れていません.こんなに多くの重複コードは抽象的にまとめて処理できないですか?抽象的で統一的に処理することはともかく、問題を解決することが目的です.解決してください.彼はさっき私も来たばかりです.各コントローラに加えて、そうではないです..ほほほと、悪口を言いながら加えて、半日もほぼ同じだと思います.これは本当にいいですか?もし今catchにいたら、eによって特別な処理が必要ですか?それとも機能が追加されますか?eggは統一されたerrorhandleが配置されています.確かに全体の間違いを処理して完全な抽象化ができます.
面に向かってプログラミングする
ここでjavaの友達に教えてもらいたいのですが、springの解決方法は、断面プログラミングに向いています.具体的な概念はネットでたくさん説明されています.すべてのコントローラの前に、あるいはコントローラとサービスの間に、このようにすれば、多くの公共論理の抽象を実現することができます.面に向かってプログラミングしてすることに適して、このspringの実践は本当に多すぎて、私は余計なことを述べなくて、誤りの異常な処理、日記、権限、これらのうどんの上の実践はすべてとても良いです.
切断面と中間部品
実は中间件は一つの面にも属していると思います.この面は要求文脉の中にありますが、この面はすべての要求をカバーできません.特に、コントロールが必要な机能は、要求を粒度に制御するのではなく、あるいはサービス层に対するサービスの追加机能が必要なだけです.
実践
ここでは冒頭のコードの簡略化を例に挙げます.まず、すべてのコントローラを包装するための包装関数の方法です.
egg.jsの実践
eggは実際にはあまり一致していません.コントローラは簡単な実用化ではないので、eggのコントローラの包装が必要ならば、loaderで包装します.参考:https://eggjs.org/zh-cn/advan...その後は既存の業務に基づいて、eggの上のフレームを沈殿させてみます.
前のプロジェクトでは、各コントローラは大体このように書かれています.
async function findId (id) {
let res;
try{
res = await document.findById(id);
}catch(e){
return false;
}
}
もちろんこのように書いても問題はありません.甚だしきに至ってはいい習慣です.彼は間違いが正常に捕獲されることを保証しました.また、catchで簡単に処理できます.例えば、consosolie、エラーログ.すべてが完璧に見えます.転換する
今は開発があったとしたら、何十個かのコントローラを書いて、try catchを入れていません.こんなに多くの重複コードは抽象的にまとめて処理できないですか?抽象的で統一的に処理することはともかく、問題を解決することが目的です.解決してください.彼はさっき私も来たばかりです.各コントローラに加えて、そうではないです..ほほほと、悪口を言いながら加えて、半日もほぼ同じだと思います.これは本当にいいですか?もし今catchにいたら、eによって特別な処理が必要ですか?それとも機能が追加されますか?eggは統一されたerrorhandleが配置されています.確かに全体の間違いを処理して完全な抽象化ができます.
面に向かってプログラミングする
ここでjavaの友達に教えてもらいたいのですが、springの解決方法は、断面プログラミングに向いています.具体的な概念はネットでたくさん説明されています.すべてのコントローラの前に、あるいはコントローラとサービスの間に、このようにすれば、多くの公共論理の抽象を実現することができます.面に向かってプログラミングしてすることに適して、このspringの実践は本当に多すぎて、私は余計なことを述べなくて、誤りの異常な処理、日記、権限、これらのうどんの上の実践はすべてとても良いです.
切断面と中間部品
実は中间件は一つの面にも属していると思います.この面は要求文脉の中にありますが、この面はすべての要求をカバーできません.特に、コントロールが必要な机能は、要求を粒度に制御するのではなく、あるいはサービス层に対するサービスの追加机能が必要なだけです.
実践
ここでは冒頭のコードの簡略化を例に挙げます.まず、すべてのコントローラを包装するための包装関数の方法です.
function controllerWrap(controllerFn, self) {
return async function() {
let that = self;
try {
await controllerFn.apply(that, arguments);
} catch(e) {
throw(e);
}
};
}
実際の注意点は2つしかないです.文脈に注意してください.そして、controllerFnのargmentsはなくならないようにします.つまり、ctxとnextのはすべてのコントローラを実例化した後です.もちろん、wrapにもっと多くの統一処理関数を注入してもいいです.また、関数名によっていくつかの判断をしてもいいです.例えば、すべての名前にsaveの関数が含まれています.egg.jsの実践
eggは実際にはあまり一致していません.コントローラは簡単な実用化ではないので、eggのコントローラの包装が必要ならば、loaderで包装します.参考:https://eggjs.org/zh-cn/advan...その後は既存の業務に基づいて、eggの上のフレームを沈殿させてみます.