Nodejs非同期コールの異常処理例分析

2259 ワード

本論文の実例は、Nodejs非同期の異常な処理について述べている.皆さんに参考にしてあげます.具体的には以下の通りです.
現在私達のプロジェクトのNodejs異常はexpress nextを通じてerrorhandlerの中間部品に処理されました.
この方法ですべての異常を捕獲できるが、事実はそうではないことが分かった.
以下に異常例を示します.

req.get('',function(req, res, next){
 var a = undefined.b; //      exception
})
req.use(function(){req, res, next}{
 next(); //    errorhandler      
})

上記の例では、私たちは人間的にexcepteinonを作りました.同時に私たちが期待している結果は、私たちが書いたhandlerに異常に入ることができます.
上のコードの運行結果から見ても、私達の予想に合致します.
もし場所を変えて異常を投げたら、結果は私達が欲しいものではないです.

req.get('',function(req, res, next){
 redis.get('key', function(){
  var a = undefined.b; //      exception
 })
})
req.use(function(){req, res, next}{
 next(); //    errorhandler      
})

上のコードから投げられた異常はexpressに捕獲されません.またnextは私達のエラープロセッサに送られません.下のコードで捕獲されます.

process.on('uncaughtException', uncaughtExceptionHandler);

したがって、nodejsでは、非同期の異常は、周辺のtry catchに捕獲されない.

req.get('',function(req, res, next){
 try{
  redis.get('key', function(){
   var a = undefined.b; //      exception
  })
 }catch(e){
  //        
 }
})

ソリューション:
1.Promise

function promiseFun() {
 return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   resolve("Hello");
   // reject();
  })
 })
}
promiseFun().then().catch();

2.Aync await

var getAsync1 = await async1();
async function async1() {
return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   resolve("Hello");
   // reject();
  })
 });
}
console.log(getAsync1);

But…
次のように書くなら

function promiseFun() {
 return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   throw Error(); //      
  })
 })
}
promiseFun().then().catch();

まだ捕まらない.
ここで述べたように、皆さんのnodejsプログラムの設計に役に立ちます.