我想为Apache服务(主要是)静态内容,因为这是我的舒适,但我希望Node.js处理服务器发送的事件。但是,它们都在同一台机器上。将通过Apache连接来自Node.js的外部JS允许我使用SSE“绕过”Apache代理?
问题是,如果我建立了我的sseListener.html在我的Apache服务器像这样:
sseListener.html(阿帕奇)
<body>
<div id="test"></div>
<script type="text/javascript">
var source = new EventSource("http://localhost:8888/test2js.js");
var test = document.getElementById("test");
source.addEventListener("message", function(e){
test.innerHTML = "";
test.innerHTML = JSON.parse(e.data).test;
}, false);
source.onopen = function(){
console.log("open: ");
}
source.onclose = function(){
console.log("close: ");
}
source.onerror = function(){
console.log("error: ");
}
</script>
</body>
我得到这个错误的控制台:
EventSource cannot load http://localhost:8888/test2js.js. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.
以下是我的Node服务器,其中上面的脚本试图co
test2js.js(节点)
var http = require("http");
var date = new Date();
function onRequest(request, response) {
console.log("Request received.");
response.writeHead(200, {"Content-Type": "text/event-stream"});
response.write("{ \"id\": \"" + date + "\", \"data\": \"test\"}");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
我知道这是因为我试图使用EventSource
客户端通过Apache送达由节点托管的服务器进行通信,就像:与mmunicate由于跨域问题,Ajax调用将如何失败。
在互联网上阅读时,我知道我可以设置一个从Apache到Node的代理,但是我也读过这样的结论,它违背了让Node处理并发连接的目的 - Apache将为其通信设置线程与节点,而不是不必这样做。
我怎么理解这个过程的工作:
但是,我不喜欢这样的请求具有路由到Apache的第一然后去节点秒。我希望请求直接转到Node。
我知道有两个“明显”的方式来做到这一点:
- 设置我的节点整个应用程序 - >这不是一个很好的选择,对我来说,我更加熟悉PHP和我JavaScript的能力不如我的PHP
- 只是通过Apache处理SSE - >我宁愿不这样做。我运行的服务器实际上并不是我自己的,我只在我的应用程序上安装并“借用”空间,所以我想实现一些轻量级的功能。
因此,想到这个问题,我想出了一个我不确定会工作的解决方案,但我不知道如何实现它:使Apache获取客户端js代码并将其链接到sseListener html的,就像这样:
<body>
<div id="test"></div>
<script type="text/javascript" src="path/to/node/file/system/sseClient.js"></script>
</body>
我猜测这样的工作的方式的话,会像:
换句话说:保存client.js文件(EventSource的)在Node目录中,使用Ap抓取该文件疼痛并以某种方式附加它,将其提供给客户。所以当客户端发出请求时,它会直接转到Node而不是Apache。
所以我的问题:
- 这可能吗?
- 如果是这样,我该如何执行此操作?
- 否则,是否有任何其他方法可以通过Apache为客户端提供文件,但将SSE端抵消给Node,没有,这样Apache就可以处理连接了吗?
从字面上看,我希望我的Node服务器执行的操作是将数据推送到Apache将生成的客户端。它根本不会做任何复杂的事情。我只是想利用它的并发连接功能来制作更高效的应用程序。
也看到这一点:http://www.html5rocks.com/en/tutorials/eventsource/basics/ – Andrii 2014-10-06 11:56:21
您好,感谢。但是当我尝试你的代码时,它仍然给了我同样的错误:'EventSource无法加载http:// localhost:8888/test2js.js。请求的资源上没有“Access-Control-Allow-Origin”标题。 Origin'http:// localhost'因此是不允许访问的.' – markovchain 2014-10-06 12:26:40
呃,不,对不起,我再也看不到这个错误了。我看到“Uncaught SyntaxError:Unexpected token M”,我可以处理。我实际上启动了一个不同的,错误的服务器。谢谢! – markovchain 2014-10-06 12:50:57