node端末統一エラー処理


起因
前のプロジェクトでは、各コントローラは大体このように書かれています.
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の上のフレームを沈殿させてみます.