Php 通过Apache从Node.JS链接外部JS是否允许我使用SSE;绕过;Apache代理?
我希望使用Apache提供(大部分)静态内容,因为这是我熟悉的,但我希望Node.js处理服务器发送的事件。但是,它们都在同一台机器上 问题是,如果我在Apache服务器中设置sseListener.html,如下所示: sseListener.html(Apache) 以下是上面脚本尝试与之通信的我的节点服务器: test2js.js(节点) 我意识到这是因为我试图使用Apache提供的Php 通过Apache从Node.JS链接外部JS是否允许我使用SSE;绕过;Apache代理?,php,node.js,apache,reverse-proxy,server-sent-events,Php,Node.js,Apache,Reverse Proxy,Server Sent Events,我希望使用Apache提供(大部分)静态内容,因为这是我熟悉的,但我希望Node.js处理服务器发送的事件。但是,它们都在同一台机器上 问题是,如果我在Apache服务器中设置sseListener.html,如下所示: sseListener.html(Apache) 以下是上面脚本尝试与之通信的我的节点服务器: test2js.js(节点) 我意识到这是因为我试图使用Apache提供的EventSource客户机与节点托管的服务器通信,就像Ajax调用由于跨域问题而失败一样 环顾互联网,我知
EventSource
客户机与节点托管的服务器通信,就像Ajax调用由于跨域问题而失败一样
环顾互联网,我知道我可以设置一个从Apache到节点的代理,但我也了解到,这违背了我让节点处理并发连接的目的——Apache将为其与节点的通信设置线程,而不必这样做
我如何理解该流程的工作原理:
但是,我不喜欢请求必须先路由到Apache,然后再路由到节点。我希望请求直接转到节点
我意识到有两种“明显”的方法可以做到这一点:
<body>
<div id="test"></div>
<script type="text/javascript" src="path/to/node/file/system/sseClient.js"></script>
</body>
那么,我猜这会起作用的方式是:
换句话说:将client.js文件(带有EventSource)保存在Node目录中,用Apache获取该文件并以某种方式将其附加,然后将其提供给客户端。因此,当客户端发出请求时,它将直接转到Node而不是Apache
所以我的问题是:
实际上,我希望我的节点服务器所做的就是将数据推送到Apache将生成的客户端。它不会做任何复杂的事情。我只是想利用它的并发连接能力来制作一个更高效的应用程序。我认为代理对于你的目标来说是个坏主意。试试这个:
var source = new EventSource("http://localhost:8888/test2js.js");
var test = document.getElementById("test");
source.onmessage = function(e){
test.innerHTML = "";
var data = JSON.parse(e.data);
test.innerHTML = data.test + data.date;
};
在test2js.js中:
function onRequest(request, response) {
console.log("Request received.");
response.writeHead(200, {"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Access-Control-Allow-Origin": "*"
});
response.write("data:{\"date\":"+date+",\"test\":\"some value\"}\n\n");
response.end();
}
嗨,谢谢。但是当我尝试你的代码时,它仍然给了我同样的错误:
EventSource无法加载http://localhost:8888/test2js.js. 请求的资源上不存在“Access Control Allow Origin”标头。起源'http://localhost因此,不允许访问。
Erm,不,对不起,我再也看不到该错误了。我看到了“未捕获的SyntaxError:意外标记m”,我可以处理。我实际上启动了另一个错误的服务器。谢谢
<body>
<div id="test"></div>
<script type="text/javascript" src="path/to/node/file/system/sseClient.js"></script>
</body>
var source = new EventSource("http://localhost:8888/test2js.js");
var test = document.getElementById("test");
source.onmessage = function(e){
test.innerHTML = "";
var data = JSON.parse(e.data);
test.innerHTML = data.test + data.date;
};
function onRequest(request, response) {
console.log("Request received.");
response.writeHead(200, {"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Access-Control-Allow-Origin": "*"
});
response.write("data:{\"date\":"+date+",\"test\":\"some value\"}\n\n");
response.end();
}