Я хочу обслуживать (в основном) статический контент с помощью Apache, так как мне это удобно, но я хочу, чтобы Node.js обрабатывал отправленные сервером события. Тем не менее, они оба на одной машине.
Проблема в том, что если я настрою свой sseListener.html в моем апаш сервер вроде так:
sseListener.html (Apache)
<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-сервер, с которым вышеуказанный скрипт пытается установить связь:
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 для связи с сервером, размещенным на Node, точно так же, как при сбое вызова Ajax из-за междоменных проблем.
Читая по интернету, я знаю, что могу просто настроить прокси от Apache до Node, но потом я также прочитал, что это противоречит моей цели, заключающейся в том, чтобы Node обрабатывал параллельные соединения — Apache будет настраивать потоки для взаимодействия с Node вместо не нужно делать это вообще.
Как я понимаю этот процесс для работы:
Но мне не нравится, что запросы сначала должны перенаправляться на Apache, а затем на Node. Я хочу, чтобы запросы шли прямо в узел.
Я понимаю, что есть два «очевидных» способа сделать это:
Поэтому, думая о проблеме, я нашел решение, которое, я не уверен, будет работать, но я также не знаю, как его реализовать: заставить 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, возьмите этот файл с помощью Apache и каким-либо образом присоедините его, передайте его клиенту. Поэтому, когда клиент делает запрос, он направляется прямо в Node, а не в Apache.
Итак, мои вопросы:
Буквально все, что я хочу, чтобы мой Node-сервер, — это передавал данные клиентам, которые сгенерирует 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();
}
Других решений пока нет …