2014-10-06 51 views
0

我想为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将为其通信设置线程与节点,而不是不必这样做。

我怎么理解这个过程的工作:

enter image description here

但是,我不喜欢这样的请求具有路由到Apache的第一然后去节点秒。我希望请求直接转到Node。

我知道有两个“明显”的方式来做到这一点:

  1. 设置我的节点整个应用程序 - >这不是一个很好的选择,对我来说,我更加熟悉PHP和我JavaScript的能力不如我的PHP
  2. 只是通过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> 

猜测这样的工作的方式的话,会像: enter image description here

换句话说:保存client.js文件(EventSource的)在Node目录中,使用Ap抓取该文件疼痛并以某种方式附加它,将其提供给客户。所以当客户端发出请求时,它会直接转到Node而不是Apache。

所以我的问题:

  1. 这可能吗?
  2. 如果是这样,我该如何执行此操作?
  3. 否则,是否有任何其他方法可以通过Apache为客户端提供文件,但将SSE端抵消给Node,没有,这样Apache就可以处理连接了吗?

从字面上看,我希望我的Node服务器执行的操作是将数据推送到Apache将生成的客户端。它根本不会做任何复杂的事情。我只是想利用它的并发连接功能来制作更高效的应用程序。

回答

1

我认为代理是你的目标不好主意。试试这个:

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

也看到这一点:http://www.html5rocks.com/en/tutorials/eventsource/basics/ – Andrii 2014-10-06 11:56:21

+0

您好,感谢。但是当我尝试你的代码时,它仍然给了我同样的错误:'EventSource无法加载http:// localhost:8888/test2js.js。请求的资源上没有“Access-Control-Allow-Origin”标题。 Origin'http:// localhost'因此是不允许访问的.' – markovchain 2014-10-06 12:26:40

+0

呃,不,对不起,我再也看不到这个错误了。我看到“Uncaught SyntaxError:Unexpected token M”,我可以处理。我实际上启动了一个不同的,错误的服务器。谢谢! – markovchain 2014-10-06 12:50:57

相关问题