2017-11-14 18 views
0

UnhandledPromiseRejectionWarning:未処理の約束拒否(却下ID:1):エラー:送信後にヘッダーを設定できません。 このエラーは、APIを継続的に使用している場合や、要求が完了する前にAPIを再度押すと発生します。 多くのソリューションを紹介していますが、適切なanswer.plsを得ることができません。(Nodejs + Restify)ヘッダーが送信された後にヘッダーを設定できません - 約束の拒否警告

exports.getRecords = function(req, res) { 

     db.task(t => { 
       return t.batch([ 
        t.any(selectQuery), 
        t.any(recordCountQuery) 
       ]); 
      }) 
      .then(data => { 

       //create a formatted object based on the two queries with recordCount 
       var output = {}; 

       output.meta = data[1][0]; 
       let petData = data[0]; 

       /* 
       * Checks If the pet details available and then processing the pets Data 
       * To get the existing image URL. 
       */ 

       if (!util.isNullOrUndefined(petData)) { 
        //Iterating over the Array of pets and process each pets with promises() 
        Promise.all(petData.map(pet => { 

          //Processing each pet 
          return processUtil.getvalidData(pet) 
           .then(pet => pet); 
         })) 
         .then(results => { 
          //After processing all the pets send the output 
          output.data = results; 
          res.json(output); 
         }) 
       }; 
      }) 
      .catch(function(err) { 
       if (util.isError(err)) { 
        res.error('NotFoundError', err); 
       } // return 404 
       else { 
        res.error('InternalServerError', err); 
       }; //else 500 

      }); 
    }; 

は、ここでリクエストが完了してしまった前に私たちは二度APIを打つ

"15" "TRACE" "services-data" "lynd-PC" "sr" "4596ec40" "" "GET" "/data/2" "request received" 
    "16" "TRACE" "services-data" "lynd-PC" "" "4596ec40" "" "GET" "/data/2" "" 
    "17" "TRACE" "services-data" "lynd-PC" "" "4596ec40" "" "GET" "/data/2" "" 
    "18" "TRACE" "services-data" "lynd-PC" "ss" "4596ec40" "200" "GET" "/data/2" "response sent" 

レスポンスログシングルヒットのため

レスポンスログ2つの応答のためのコンソールログです。

"15" "TRACE" "services-data" "lynd-PC" "sr" "1a85afb7" "" "GET" "/data/2" "request received" 
"15" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" "" 
"16" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" "" 
"17" "TRACE" "services-data" "lynd-PC" "ss" "1a85afb7" "500" "GET" "/data/2" "response sent" 
"18" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" "" 
(node:3860) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Can't set headers after they are sent. 
+0

データベースとは何ですか? 'db.task()'と 't.batch()'は複数の呼び出しが同時に飛行しているときに完全に安全ですか? – jfriend00

答えて

1

まず、コードにPromise.all()のリジェクトハンドラはありません。未処理の拒絶のための1つの機会を修正しますので、

return Promise.all(petData.map(pet => { 

、このへ

Promise.all(petData.map(pet => { 

:あなたは、これを変更することにより、(ハンドラを拒否していない)親約束チェーンにそれを連鎖することができます。別のリジェクトハンドラがある場合は、Promise.all()プロミスに独自のリジェクトハンドルを追加することもできます。


また、応答を送信しないコードパスがいくつかあるようです。この条件場合:

if (!util.isNullOrUndefined(petData)) { 

がsatisifiedされていない送信するすべての要求は正確に一つの応答を必要とするので、その後、あなたのコードは、通常、コーディングミスである任意の応答を送信しません(それはifブロックに入らないという意味) 。

関連する問題