2013-08-14 12 views
1

익스프레스 프레임 워크를 사용하여 res.send()에서 이상한 동작이 나타납니다. 이것은 에러 또는 결과 객체를 수신하거나익스프레스 (node.js) - res.send는 응답 부분 만 보냄

user.register(function(err, result) { 
    console.log(JSON.stringify(err || result)); 
    res.send(JSON.stringify(err || result)); 
}); 

:

여기에 내 함수이다.

{"name":"AuthError","message":"Password confirmation does not match original password","code":36} 

클라이언트가받은 응답은 그러나 :

{"name":"AuthError","message":"Password confirmation does not match 

이 내가받을 수있는 오류 발생 여기 console.log()에서 예입니다. 나는 왜 이것이 단순한 JSON 문자열을 보내려고하는지 이해하지 못한다. 아무도 이것이 가능한 원인을 알 수 있습니까?

편집 : 나는이 문제를 해결했지만 누군가가 뒤에 이유를 설명 할 수 있다면 나는 감사 드리겠습니다.

오류가 발생할 때마다 user.register() 기능을 종료하는 것을 잊었으며 계속해서 데이터베이스를 쿼리했습니다. 일단 함수가 적절하게 종료되었다고 확신하게되면 응답은 전체적으로 수신됩니다 ... 그러나 이것에 대한 원인은 무엇입니까?

복수 res.send()은 첫 번째 호출이 끝나기 전에 호출 되었기 때문에 (user.register() 함수는 적절하게 종료하지 않으면 여러 콜백 호출을 수행합니다)? 콘솔에 예외가 기록되지 않았습니다.

+4

'res.send'를 호출하기 전에 객체를 문자열화할 필요가 없습니다. 그것은 당신을 위해 그것을 수행하고 Content-Type을 적절하게 설정합니다. – josh3736

+0

@ josh3736 매우 감사합니다. –

+0

그러면 응답 JSON이 클라이언트에서 잘린 것을 확인 했습니까? 브라우저 콘솔/디버거 또는 다른 것을 확인 했습니까? – Pointy

답변

0

res.end() 호출이 표시되지 않습니다. 당신이 다음 오류 내가 갖는을 삼키는 수 있으며, 한 번 이상 res.send 호출하는 경우 또한 가능 보인다

http.js:707 
    throw new Error('Can\'t set headers after they are sent.'); 
     ^
Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (http.js:707:11) 
    at ServerResponse.res.setHeader (C:\projects\javascript\node\node_modules\express\node_modules\connect\lib\patch.js:59:22) 
    at ServerResponse.res.set.res.header (C:\projects\javascript\node\node_modules\express\lib\response.js:518:10) 
    at ServerResponse.res.contentType.res.type (C:\projects\javascript\node\node_modules\express\lib\response.js:390:15) 
    at ServerResponse.res.send (C:\projects\javascript\node\node_modules\express\lib\response.js:107:14) 
    at readyToEnd (C:\projects\javascript\node\spawn.js:43:10) 
    at Socket.<anonymous> (C:\projects\javascript\node\spawn.js:22:40) 
    at Socket.EventEmitter.emit (events.js:117:20) 
    at _stream_readable.js:910:16 
    at process._tickCallback (node.js:415:13) 
내가 만든까지 던져 어떤 오류가 표시되지

res.end()이 호출 될 때의 변경. 아마 그것은 또한 너에게 일어나고있다. res.send()이 본문 크기의 머리글을 설정하려고하므로 다시 호출하면 이미 보낸 머리글이 무효화됩니다.

res.end() 경우 res.send() 전에 호출거나 다른 res.send()는 오류가 지금까지 내 테스트에서 발생하는 것으로 나타나지는 다른 부분을 전송할 수 없습니다 바로 res.end() 전에 호출된다.

0

Express 3.3.4와 비슷한 문제점이 있으며 Express 3.15.0으로 업데이트 한 후 문제 코드를 찾았습니다.

내 경우에는 을 res.json()으로 두 번 호출했습니다. 같은 일을하지 않도록하십시오. 새 Express 버전은 콘솔에서 이러한 상황을 통지합니다.

관련 문제