Php 通过Apache从Node.JS链接外部JS是否允许我使用SSE;绕过;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调用由于跨域问题而失败一样 环顾互联网,我知

我希望使用Apache提供(大部分)静态内容,因为这是我熟悉的,但我希望Node.js处理服务器发送的事件。但是,它们都在同一台机器上

问题是,如果我在Apache服务器中设置sseListener.html,如下所示:

sseListener.html(Apache)

以下是上面脚本尝试与之通信的我的节点服务器:

test2js.js(节点)

我意识到这是因为我试图使用Apache提供的
EventSource
客户机与节点托管的服务器通信,就像Ajax调用由于跨域问题而失败一样

环顾互联网,我知道我可以设置一个从Apache到节点的代理,但我也了解到,这违背了我让节点处理并发连接的目的——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目录中,用Apache获取该文件并以某种方式将其附加,然后将其提供给客户端。因此,当客户端发出请求时,它将直接转到Node而不是Apache

    所以我的问题是:

  • 这可能吗
  • 如果是,我该如何实施
  • 否则,是否有其他方法通过Apache向客户端提供文件,但将SSE端偏移到节点,而不让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();
      }