node.js - 部署到 Heroku 时这个 Backbone/node/express 400 Bad Request 错误是怎么回事?

标签 node.js heroku backbone.js xmlhttprequest express

在将我的 Backbone.js/node.js 应用程序部署到 Heroku 时,我遇到了 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)

从 Chrome devtools 的网络选项卡:

enter image description here

localhost 上运行时不会出现错误。

enter image description here

有趣的是,直接访问 URL 效果很好。手动 jQuery.ajax() 调用也可以正常工作。此 Backbone.sync 调用是资源失败的唯一实例,但它始终失败。

部署到 Heroku 时,这个 Backbone/node/express 400 Bad Request 错误是怎么回事?我的猜测可能与代理/路由器工件有关,例如 x-forwarded-for 但此时我无法判断错误是在 Backbone、express 还是 Heroku 级别。

主干请求 header (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

这是 header 差异 ( bigger version here ):

enter image description here

最佳答案

我不知道你是否已经尝试过这个,但是当从你的服务器发送响应而不是使用普通的旧时

response.send(响应发送);

尝试使用

response.json(response to send);

相反。

我遇到了同样的错误,但我终其一生都找不到解决方案,切换后它立即起作用。希望这会有所帮助。

关于node.js - 部署到 Heroku 时这个 Backbone/node/express 400 Bad Request 错误是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11219455/

相关文章:

javascript - 显示具有下标(或上标)样式的菜单项标签

git - 如何在限制 ssh 的防火墙后面通过 https 访问 heroku git

ruby-on-rails - 最佳实践 - RoR 4 Heroku - Cron 每小时从外部 API 填充数据库

javascript - Backbone.js 添加到集合

python - 理解 Python 的 Base64 解码字节表示

javascript - nodejs与mysql,无法从数据库获取数据

javascript - Promise是一种实现异步编程的技术吗?

git - 从 github 推送到 heroku,无需下载 repo

javascript - 无法在主干 View 中定义两个事件

backbone.js - 如何使用 Backbone Relational 从初始 JSON 自动创建多对多关系?