我已经为这个问题苦苦挣扎了整整一个周末。该问题仅在通过 Mac 访问且通过我的 Nodejitsu 实例进行托管时存在,在本地主机上不存在。
我的应用程序非常典型。它具有 Web 服务器组件和不同域上的 REST 服务器 -- 因此需要CORS。唯一增加的复杂性是自定义标头。
我已设置 CORS 如下:
技术上讲这应该可以运行。这是一个传统的ajax调用到node服务器,但当我在chrome中进行调用时,在chrome终端中出现以下错误pre-preflight。
问题在于在简单的HTTP之后几乎立即必须执行预检,因此oauth与fb登录不起作用,因为它需要在执行所需操作之前向fb发出几个请求并返回。
我的应用程序非常典型。它具有 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台上进行预检和验证。