HTML5事件源API和node.js |如何将流发送到正确的客户端?

时间:2014-11-19 20:09:06

标签: javascript html5 node.js server-sent-events event-sourcing

出于某种原因,我认为没有必要提及,我不能使用socket.io,我决定使用HTML5事件源API(服务器发送事件)向客户端发送消息。该消息告诉客户他的付款是通过第三方回调收到的。

我有一个识别每个客户端的ID,它也会在回调中收到。到目前为止,我有两个问题:

  1. 我想发送的每条消息都会广播给所有客户端。有没有办法通过他的ID选择特定的客户?

    目前我正在使用if语句在客户端实现此功能,但如果我可以直接从服务器向客户端发送消息以提高性能将是很好的

  2. 当我关闭客户端上的连接时,我想我没有关闭所有建立的连接,不是吗?
  3. 我的代码:

    Node.js的

    app.get('/payments', function(req, res) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
    
        res.writeHead(200, {
            'Content-Type': 'text/event-stream',
            'Connection': 'keep-alive',
            'Cache-Control': 'no-cache',
        });
    
        ee.on("payment", function (data) {
                res.write("data: "
                    + JSON.stringify({'wallet': data.address, 'refund_address': data.refund_address,'payment_status': 'paid'})    
                    + "\n\n"
                );
        });
    });
    

    客户端

                  var source = new EventSource("/payments");
                  source.addEventListener('message', function(e) { 
                  if (e.origin == 'http://localhost:3000') {
                          var data = JSON.parse(e.data);
                              if (btcwalletdir == data.wallet) { //each client filter  
                                      // do whatever here                                    
                                      source.close();
                               }   
                          return;
                         }  
                      }, false);
    

    它是生产环境的有效解决方案吗?

    此致

1 个答案:

答案 0 :(得分:1)

关于EventSource,每个客户端都有自己的连接。每当有人访问该端点时,它都会分配一个请求/响应,因此当您执行res.write时,您只会写入一个客户端。

但当然,如果您播放该活动"付款"对于每个连接,每个连接都将json消息发送给相应的客户端。因此,您需要找到一种方法来仅将数据发送到正确的连接(例如,向您发出的数据添加用户/连接ID并将res对象存储在数组/对象中)