使用jQuery – JSONP从Vagrant VM上托pipe的第三方Node.js服务器获取数据
我有一个Node.js服务器监听本地主机:3000 作为一个黑盒子 , 输出我想加载到本地网站的用户界面 。
用jQuery编写的消费服务是:
$('.my_selector').click(function(){ $.ajax({ url: ':3000/', method: "POST", success: function(data) { $("#content").append(data); }, error: function(jqXHR, textStatus, errorThrown) { alert('error ' + textStatus + " " + errorThrown); } }); });
不是直接访问页面,而是加载内容并将其附加到#content
。
问题是代码不起作用。
编辑:
如果我设置localhost:3000
到url
我得到XMLHttpRequest Exception
:
jquery.min.js:4 XMLHttpRequest cannot load localhost:3000/. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource
您需要使用JSONP来克服Cross来源问题。 尽pipeNode服务器和您的自定义访问网页都在本地主机上,但请注意,configuration上有很大差异:
- 您的自定义访问网页完全托pipe在本地LAMP堆栈*上。
- 节点只是本地configuration的代理/反向代理 (感谢Vagrant自动化)!
节点服务器的真实(虚拟)IP是在vagrant虚拟机上configuration的IP,您可以在向VM 打开ssh会话后使用ifconfig
检查它。 这样从本地托pipe的页面接收的HTTP响应在标题中具有不同的IP和域,并且触发了跨源exception。
* =假设你正在运行一个LAMP系统。
使用url:“/”默认的主机名使用是当前在URL window.location.host你的情况localhost:3000。 只需指定/为path
更改url: ':3000/'
,到url : "http://127.0.0.1:3000"
。
你需要做的3件事情:
-
url: ':3000/'
不正确,你需要把它改成url: 'localhost:3000'
- 你需要把你的HTML,javascript,css,…文件放在你的本地主机(如:
localhost:4000
)上运行的web服务器上(比如apache,nginx等)。 不要打开HTML文件右键单击然后select打开与Chrome或类似的东西,它将无法正常工作 。 并访问包含该JavaScript文件的页面(例如:localhost:4000/page-contain-your-javascript.html
) -
处理跨域问题:
使用反向代理(如nginx)将请求发送到
localhost:3000/page-contain-your-javascript.html
到localhost:4000/page-contain-your-javascript.html
。 而现在,当你访问localhost:3000/page-contain-your-javascript.html
你的javascript和API现在在同一个域(localhost:3000)中时 ,你可以正常使用AJAX。
希望它可以帮助你:)