2014-10-08 5 views
0

나는 nodejs와 함께 정말 이상한 문제가있다.Node.js express, timeout "보낸 후 헤더를 설정할 수 없습니다."

요청을 처리하는 제 기능 중 하나는 DB에서 무언가를 가져와 JSON으로 클라이언트에 보내야합니다.

  1. GET 요청
  2. 통화 DB
  3. 프로세스 데이터를 정상적으로

JSON에

  • response.json (JSON을)를 팩 :

    는 그래서 이렇게되면 모두 괜찮아 질 것입니다.하지만 비동기 적으로 2와 3 사이의 시간 초과가 있으면 자동으로 응답을 만들고 오류가 발생합니다 "h 그들이 보낸 후에 eaders. " 전화 할 때

    다른 사람이이 문제를 겪고 있습니까? 그것을 처리하는 정상적인 방법이 있습니까 아니면 그냥 response._header가 allready 설정되어 있는지 확인해야합니까?

    exports.appstimebygroup = function (req, res) { 
        var resp = {}; 
        var clientId = Webapi.extractClientId(req); 
    
        AppTime.getByGroupId(clientId, req.body.groupId, function(error, appstime){ 
         if (error) { 
          handleError(error); 
          resp.returnCode = 0; 
          resp.message = "Some error have happened, please contact support!"; 
          res.setHeader("Content-Type", "application/json"); 
          res.json(resp); 
          return; 
         } 
    
         resp.returnCode = 1; 
         resp.appstime = appstime; 
    
         if(res._header){ 
          console.log("header allready set!"); 
          return; 
         } 
    
         res.setHeader("Content-Type", "application/json"); 
         res.json(resp); 
        }); 
    }; 
    

    그리고 AppTime.getByGroupId에는 비동기 호출이 있습니다.

  • +0

    내 생각에 비동기 요청이 응답을 보내기 전에 먼저 완료 될 때까지 기다리지 않아서 동일한 요청에 대해 응답을 두 번 보내려고합니다. 관련 코드를 게시하면 확실하게 알 수 있습니다. – mscdex

    +0

    코드를 추가했습니다. 하지만 이미 설명했듯이 코드에는 문제가 없습니다. 타임 아웃은 비동기 호출 중간에 타임 아웃이 발생하고 익스프레스가 헤더를 설정하여 전송하기 때문에 문제가 발생합니다. 그리고 통화가 끝나면 내 기능이 다시 시도합니다. 이 오류를 독립형으로 반복 할 수도 있습니다. –

    +1

    나는 여기에서 무엇이든 잘못 보지 않는다. 'handleError'는 무엇을 하는가? 또한'Content-Type' 헤더를 설정하는 이유는 무엇입니까? 'res.json'은 이미 당신을 위해 이것을합니다 -> [링크] (https://github.com/strongloop/express/blob/12f92a50dc59887c30f4c6f23fdfbfc616dcbef5/lib/response.js#L232) – Jordonias

    답변

    0

    그래, 문제는 multipart-form-data handling timeout입니다.

    이렇게되면 다음 (err)을 호출합니다.

    form.on('error', function(err){ 
        if (!options.defer) { 
         err.status = 400; 
         next(err); 
        } 
        done = true; 
        }); 
    

    오류에 기본적으로 할 것 res.send (400) 때 일반적으로는 문제가 실행하고 싶다고 코드에 가져옵니다.

    관련 문제