使用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:3000url我得到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件事情:

  1. url: ':3000/'不正确,你需要把它改成url: 'localhost:3000'
  2. 你需要把你的HTML,javascript,css,…文件放在你的本地主机(如: localhost:4000 )上运行的web服务器上(比如apache,nginx等)。 不要打开HTML文件右键单击然后select打开与Chrome或类似的东西,它将无法正常工作 。 并访问包含该JavaScript文件的页面(例如: localhost:4000/page-contain-your-javascript.html
  3. 处理跨域问题:

    使用反向代理(如nginx)将请求发送到localhost:3000/page-contain-your-javascript.htmllocalhost:4000/page-contain-your-javascript.html 。 而现在,当你访问localhost:3000/page-contain-your-javascript.html你的javascript和API现在在同一个域(localhost:3000)中时 ,你可以正常使用AJAX。

希望它可以帮助你:)