2017-11-14 19 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" 

응답 로그 하나의 히트에 대한

응답 로그 두 응답 콘솔 로그입니다.

"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()에 대한 거부 처리기가 없습니다. 처리되지 않은 거부에 대해 하나의 기회가 해결됩니다 그래서

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

,이에

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

: 당신은이를 변경하여 (A 핸들러를 거부해야합니까) 부모 약속 체인에 체인 수 . 또는 별도의 거부 처리기를 사용하려는 경우 Promise.all() 약속에 자체 거부 핸들을 추가 할 수 있습니다.


응답을 보내지 않는 코드 경로가 여러 개있는 것 같습니다. 이 조건 경우

if (!util.isNullOrUndefined(petData)) { 

가 만족스러운되지 않고 전송되는 모든 요청에 ​​정확히 하나의 응답을 필요로하기 때문에, 다음 코드는 일반적으로 코딩 실수 어떤 응답을 보내지 않습니다 (가 if 블록으로 이동하지 않습니다 의미) .