【问题标题】:Why does a cross domain request work in Chrome but fail in Firefox when requesting from a Node (Express) server?为什么跨域请求在 Chrome 中有效,但在从 Node (Express) 服务器请求时在 Firefox 中失败?
【发布时间】:2012-03-18 12:22:33
【问题描述】:

一些设置信息:我们将 jQuery 用于 AJAX(和其他东西,但 AJAX 与这个问题有关),Node w/ Express 用于服务器,Chrome 17/Firefox 10 用于测试(我们不需要与 IE 兼容)。

我们遇到的问题是向 Node 服务器发出跨域请求时无法获得响应。出于开发目的(也因为我们现在必须在此服务器之外运行 Apache),我们在端口 3001 (localhost:3001) 上运行节点服务器,即使在 localhost 上,浏览器也将其视为跨域(在至少根据我的经验,试图让 localhost 上的两台服务器相互通信)。

我在服务器上设置了app.enable("jsonp callback"),它非常适合我们的GET 路由,但它似乎不适用于我们的POST 路由(现在这一切都在内部,但是欢迎提供更好的替代方案作为建议)。

有问题的路线定义如下:

app.post("/create", function(req, res) {
  // Added the next 3 lines as a test and it seemed to add success, 
  // not happy with it though
  var ref = req.header("Referer");
  res.header("Access-Control-Allow-Origin", ref);
  res.header("Access-Control-Allow-Methods", "POST");
  console.log(req.body); // echo request body
  res.json({success: true}); // return a notification of success
});

AJAX 请求如下所示:

// The URL is either the IP of the server or Localhost
$.ajax({
  url: "http://localhost:3001/create",
  data: { 
    name: "john" 
  },
  crossDomain: true,
  type: "POST", 
  dataType: "json",
  success: function(r) {
    console.log(r);
  },
  error = function() {
    alert("Failed");
  }
};

一些次要信息,当我们在 Firefox 中使用上面的 dataType: "jsonp" 时,它只会以 404 失败,但实际上只使用 "json" 发送请求。另一点信息是,没有crossDomain: true,请求根本不起作用。用上述方法发出的 Firefox 请求实际上是通过服务器,但是在收到响应之前它就出错了。

请求工作正常,在 Chrome 中成功,但在 Firefox 中失败。根据控制台,响应返回“200 OK”状态,但它仍然触发 jQuery.ajax 错误函数,其中 0statusCodeErrorstatusText (这非常有帮助...... ) 尽管我们已经尝试过,但在完成这项工作方面并没有取得任何进展。

非常感谢任何有关解决此问题的帮助或指导。

更新

只是为了更新。这个问题已经停止发生,也许是我们在重构中修复的代码中的一些潜在错误而没有意识到它,或者是 Firefox 中的错误已被修复。无论哪种方式,我们都不再遇到此问题。

【问题讨论】:

    标签: jquery ajax node.js cross-domain express


    【解决方案1】:

    假设你想做JSONP风格的回调,你需要两件事:app.enable("jsonp callback")(不是app.enable("json callback"))。此外,您需要通过在 URL 中指定 callback=? 来指示 jQuery 进行 JSONP 调用。

    【讨论】:

    • 是的,你是对的,它是jsonp callback,我错误地复制了它(但现在更正了)。此外,如果我告诉 jQuery 直接执行 "jsonp" 请求,它根本不起作用——事实上,它完全忽略了 POST,只发送 GET 请求。但是,使用 crossDomain: true 和使用 dataType: "json" 请求有效。无论如何,这不是我真正的问题,问题是为什么它在 Chrome 中有效,但在 Firefox 中无效?
    • 只是为了尝试我尝试实施您提出的解决方案,但它开始以 404 未找到的方式咆哮 - 与我上面的用法相反,响应通过并返回“200 OK”但仍然失败在 Firefox(不是 Chrome)中。
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2013-10-24
    • 2013-03-21
    • 1970-01-01
    • 2014-08-22
    • 2017-04-01
    • 2016-01-12
    • 2013-03-07
    相关资源
    最近更新 更多