2012-06-27 2 views
3

Heroku에 Backbone.js/node.js 앱을 배포 할 때 400 Bad Request 오류가 발생합니다. 로그에서Heroku에 배포 할 때 Backbone/node/express 400 Bad Request 오류가 발생했습니다.

:

Error: Bad Request 
    at Object.error (/app/node_modules/express/node_modules/connect/lib/utils.js:42:13) 
    at IncomingMessage.<anonymous> (/app/node_modules/express/node_modules/connect/lib/middleware/json.js:57:73) 
    at IncomingMessage.emit (events.js:64:17) 
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:130:23) 
    at Socket.ondata (http.js:1506:22) 
    at TCP.onread (net.js:374:27) 

크롬의 네트워크 탭에서이 DevTools로 : localhost에서 실행할 때

enter image description here

오류가 표시되지 않습니다. URL이 잘 작동에

enter image description here

흥미롭게도, 직접 얻을. 설명서 jQuery.ajax()도 제대로 작동합니다. 이 Backbone.sync 호출은 리소스가 실패하지만 일관되게 실패하는 유일한 인스턴스입니다.

백본/노드/익스프레스 400 헤로 쿠에 배포 할 때 잘못된 요청 오류가 발생 했습니까? 내 생각 엔 x-forwarded-for과 같은 프록시/라우터 아티팩트와 관련된 것이지만 오류가 백본, 익스프레스 또는 헤로 쿠 수준에 있는지는 알 수 없습니다.

백본 요청 헤더 (400 잘못된 요청)

GET /services HTTP/1.1 
Host: karmr.herokuapp.com 
Connection: keep-alive 
Cache-Control: max-age=0 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1082.0 Safari/536.5 
Content-Type: application/json 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://karmr.herokuapp.com/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

HTTP/1.1 400 Bad Request 
Content-Type: text/plain 
X-Powered-By: Express 
Content-Length: 420 
Connection: keep-alive 

직접 GET (200 OK) : 여기

GET /services HTTP/1.1 
Host: karmr.herokuapp.com 
Connection: keep-alive 
Cache-Control: max-age=0 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1082.0 Safari/536.5 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8 
X-Powered-By: Express 
Content-Length: 84 
Connection: keep-alive 

은 (bigger version here) 헤더 차이점이다 :

enter image description here

답변

2

서버에서 응답을 보내는 대신 평범한 구식를 사용하는 경우

response.send(response to send);

시도

를 사용하여

대신.

나는이 똑같은 오류가 나타나서 나를 찾았지만 해결책을 찾지 못했다. 희망이 도움이됩니다.

+0

이것은 수정의 일종으로 밝혀졌습니다. 명백하게 표현 체가 미들웨어를 파싱하는 버그였습니다. 해결 미들웨어 호출을 제거하지만, 그래서이 믿을 것이다. – buley

+2

트릭을 수행 했습니까? 나는 backbone.sync가'Content-Type : application/json' 요청 헤더를 설정했기 때문에 (backbone 위에 구축 된 spine.js에서) 같은 문제를 보았습니다. , 서버 (또는 body 파서, 아마?)는 요청의'body'가 비어 있지 않을 것으로 기대합니다. 아직 해결책은 없지만, 한가지 방법으로'bodyParser'를 비활성화하는 것을 좋아하지 않습니다! ** 편집 : ** BodyParser가이 문제를 일으키는 것으로 확인했습니다. – Fabdrol

2

두 줄의 조사를 제안합니다. 에 :

  1. URL이 JSON를 응답하지 않는 경우이 URL가 응답하고 왜 적절한 JSON을 응답하지 않는 것을 확인합니다. 머리글을 볼 경우 클라이언트application/json, text/javascript, */*; q=0.01이고 URL은 text/plain입니다.

  2. 크로스 도메인 문제이 있습니다 : 확인 모든 나는 아직이 시도 한 경우 몰라요,하지만 issues about CROSS-Domain