无法让 CORS 工作(NodeJS)
Posted
技术标签:
【中文标题】无法让 CORS 工作(NodeJS)【英文标题】:Can't get CORS to work (NodeJS) 【发布时间】:2012-11-19 04:08:30 【问题描述】:我正在尝试设置跨域的 GET 请求。域 A 是目标,它有一个名为 /getUser 的服务:
(...)
server.get('/getUser', function(req, res)
console.log('Call received');
(...)
如您所见,它并没有起到什么作用,我只是想确保请求到达。 域A有一个公共的js文件,实现了对这个服务的调用:
function callDomainA()
var url = 'https://domainA.com/getUser?callback=?';
var xhr = _createCORSRequest('GET', url);
if (!xhr)
console.log('CORS not supported by browser, try jsonp');
_doJSONP(url)
else
xhr.onload = function()
console.log('Success : ' + JSON.stringify(xhr.responseText));
;
xhr.onerror = function()
console.log('ERROR : There was an error with the CORS request.');
;
xhr.send();
return false;
function _doJSONP()
(...)
function _createCORSRequest(method, url)
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr)
xhr.open(method, url, true); // XHR for Chrome/Firefox/Opera/Safari.
else if (typeof XDomainRequest != "undefined")
xhr = new XDomainRequest(); // XDomainRequest for IE.
xhr.open(method, url);
else
xhr = null; // CORS not supported.
return xhr;
然后我有Domain B,它从Domain A加载js脚本,然后执行callDomainA()函数:
<script src="https://domainA.com/domainApublicjsfile.js" type="text/javascript"></script>
(...)
callDomainA();
(...)
当我在域 B 中加载包含对域 A 的调用的页面并触发对 callDomainA() 的调用时,代码检测到浏览器 (Firefox) 可以执行 CORS,但我收到的标头指示错误 500 和ns_error_dom_bad_uri
我会期待这样的事情,因为我在域 A 中没有做任何事情来接受 CORS 请求或任何事情,但我担心请求似乎没有到达服务,或者至少 console.log () 没有注册任何东西。
我错过了什么吗?
提前感谢您的宝贵时间。
【问题讨论】:
稍微简化一下。使用 curl 或 wget 向/getUser
发出请求。它有效吗?可能不会,如果没有,请从您的问题中删除所有客户端内容。
【参考方案1】:
?
在 URI 中仅有效一次,表示查询字符串的开始。之后,需要进行 URL 编码:
.../getUser?callback=%3f
但是,虽然这可能会通过浏览器的验证,但它仍然不是 JSONP 的有效“padding”。 callback
应指定将被调用并传递 JSON 响应的全局函数的名称:
function handleJSONPRequest(data)
// ...
function callDomainA()
var url = 'https://domainA.com/getUser?callback=handleJSONPRequest';
// ...
callback=?
快捷方式是某些库(例如 jQuery)的一项功能,可将 ?
替换为生成的函数的名称。不过,XMLHttpRequest
不支持它。
$.getJSON('.../getUser?callback=?');
// GET .../getUser?callback=jQuery18204235873776488006_1354320142256&...
【讨论】:
服务器端的一些错误导致了问题。我还修复了回调“?”问题,谢谢。服务器端,我正在查看 req.headers.origin。如果提供,我假设客户端正在使用 CORS (_createCORSRequest())。否则我会查看 req.headers.referer。然后,我将此值与我的授权域列表进行比较。如果授权,则进行否则发送错误。这是确保只有授权域请求此服务的正确方法吗?谢谢【参考方案2】:我想向你推荐我的模块simpleS,它以一种非常简单的方式实现了CORS,并在Google Chrome、Mozilla Firefox 和Opera 上进行了测试。默认情况下,它旨在接受来自当前主机或本地文件系统来源的请求。要接受来自其他来源的请求,您需要这样的东西:
var simples = require('simples');
var server = simples(80);
server.config(
cors:
origins: ['domaina.com', 'domainb.com'] // ['*'] for requests from anywhere
);
server.get('/getUser', function (request, response)
// Your application logic
);
关于 simples here 的更多文档。该模块仍在开发中,但您可以尝试一下。
【讨论】:
以上是关于无法让 CORS 工作(NodeJS)的主要内容,如果未能解决你的问题,请参考以下文章
nodejs - 无法让 paypal-ipn 工作。 Paypal 不断返回“无效”
在 NodeJS 中使用集群时无法让所有工作人员进入工作程序块