Будет ли подключение внешних JS из Node.js через Apache позволять мне использовать SSE «в обход» прокси-сервер Apache?

Я хочу обслуживать (в основном) статический контент с помощью 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. Я хочу, чтобы запросы шли прямо в узел.

Я понимаю, что есть два «очевидных» способа сделать это:

  1. Настройте все мое приложение в Node -> Это не очень хороший вариант для меня, так как мне гораздо удобнее работать с PHP, и моя способность JavaScript не так хороша, как мой PHP
  2. Просто обработайте SSE с помощью Apache -> Я бы тоже не стал этого делать. Сервер, на котором я работаю, на самом деле не один, я только монтирую на нем свое приложение и «заимствую» пространство, поэтому я хотел бы реализовать что-то настолько легкое, насколько я могу себе представить.

Поэтому, думая о проблеме, я нашел решение, которое, я не уверен, будет работать, но я также не знаю, как его реализовать: заставить 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.

Итак, мои вопросы:

  1. Это возможно?
  2. Если так, как я могу это реализовать?
  3. В противном случае, есть ли другие методы для доставки файлов клиентам через Apache, но смещение стороны SSE на Node, без сделать так, чтобы Apache также обрабатывал соединения?

Буквально все, что я хочу, чтобы мой Node-сервер, — это передавал данные клиентам, которые сгенерирует Apache. Это не будет делать ничего сложного вообще. Я просто хочу использовать эту возможность для одновременных подключений, чтобы сделать более эффективное приложение.

0

Решение

Я думаю, что прокси плохая идея для ваших целей. Попробуй это:

    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();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]