jQuery没有发送自定义标头的CORS请求到node.js服务器,还是服务器没有接收到?

3
我已经为这个问题苦苦挣扎了整整一个周末。该问题仅在通过 Mac 访问且通过我的 Nodejitsu 实例进行托管时存在,在本地主机上不存在。
我的应用程序非常典型。它具有 Web 服务器组件和不同域上的 REST 服务器 -- 因此需要CORS。唯一增加的复杂性是自定义标头。
我已设置 CORS 如下:
var allowCrossDomain = function(req, res, next) {

    console.log(req.headers);

    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Accept, X-api-key, X-auth-token, Content-Type, Content-Length');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
        res.header('Access-Control-Allow-Origin', '*');
        res.header('Access-Control-Allow-Headers', 'Accept, X-api-key, X-auth-token, Content-Type, Content-Length');
        res.send(200, {});
    }
    else {
      next();
    }
};

前端的 $.ajax 调用是这样的

//create user
$.ajax({
    url: host + 'users',
    headers: {'X-api-key': apikey},
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify({
        email: userInfo.email,
        username: username,
        password: pasword,
    }),
    xhrFields: {},
    crossDomain: true,
    success: function (res) {
        console.log(res);
        $('.messages')
            .removeClass('error')
            .addClass('success')
            .html('<strong>Success! </strong>Check email for activation link');
    },
    error: function (xhr, status, errorThrown) {
        console.log(xhr.responseText);
        var errorMessage = $.parseJSON(xhr.responseText);
        $('.messages')
            .removeClass('success')
            .addClass('error')
            .html('<strong>Oops!</strong> '+errorMessage.error);

    }
});

技术上讲这应该可以运行。这是一个传统的ajax调用到node服务器,但当我在chrome中进行调用时,在chrome终端中出现以下错误pre-preflight。

    OPTIONS http://api.dev.XXXXX.com/users/login net:: ERR_EMPTY_RESPONSE
    jquery-1.7.2.js: 8240
    send jquery-1.7.2.js: 8240
    jQuery.extend.ajax jquery-1.7.2.js: 7719
    (匿名函数) VM62:2
    InjectedScript._evaluateOn VM57:730
    InjectedScript._evaluateAndWrap VM57:669
    InjectedScript.evaluate

在Firefox / Mozilla上是这样的,在Safari上也非常相似:

    "NetworkError:502 Bad Gateway - http://api.dev.XXXX.com/users/fbauth"
    fbauth
    跨源请求被阻止:同源策略禁止读取远程资源http://api.dev.XXXX.com/users/fbauth。这可以通过将资源移动到同一域或启用CORS来解决。

我已经通过在复杂HTTP请求之前向服务器发送简单HTTP请求来部分绕过此问题。我不知道为什么这会使它工作,这使它成为世界上最丑陋和最部分有效的黑客。

  $(document).ready(function(){
    setTimeout(function(){
    $.ajax({
      url: host + 'users/login',
      type: 'POST',
      dataType: 'json',
      data: JSON.stringify({

      })
    });

    $.ajax({
      url: host + 'users/fbauth',
      type: 'POST',
      dataType: 'json',
      data: JSON.stringify({

      })
    });

    }, 500);
  })

问题在于在简单的HTTP之后几乎立即必须执行预检,因此oauth与fb登录不起作用,因为它需要在执行所需操作之前向fb发出几个请求并返回。

我完全被卡住了。这是Webkit / Mozilla引擎的问题吗?还是我在这里遗漏了关键的东西?

这里有一个jsfiddle,其中包含对测试端点的示例请求。运行时请检查控制台。 http://jsfiddle.net/cvince/6nPLJ/

问题-- 在我的主要开发计算机上失败,但可能适用于您。该请求在我的6台计算机中的4台上进行预检和验证。

1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接