如何最好地使用 socket.io 和 pub/sub 来创建与 API 调用的连接 - Nodejs

How to best use socket.io and pub/sub to create connection to API call - Nodejs

我已经创建了我的第一个 Nodejs 应用程序。我正在使用 socket.io 和快递。我试过这个教程:https://socket.io/get-started/chat/,我发现 emit 是我可能不需要确定的东西。

我的应用程序显示股票行情,我正在使用 API,我有 url 比如:https://quotes.example.com/v1/file.json/johndoe?&_token=tokenumber

所有打开 http://example.com/live 页面的用户,我想将股票代码推送或发送到此页面。我如何最好地实现这一目标?我知道实时页面需要成为所有用户都会订阅的频道,我正在向它推送数据。

我以前从未做过实时应用程序,欢迎所有建议。

已编辑

前端代码

<!doctype html>
<html>
  <head>
    <title>Live Stock Quotes App</title>
    <style>
      body { font: 26px Helvetica, Arial; font-weight:bold;}

      #livequotes { text-align: center;}
    </style>
  </head>
  <body>
    <p id="livequotes"></p>


    <script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>

<script>
  $(function () {
    var socket = io('/channel1');

     socket.on('live-quote', function(msg){
      $('#livequotes').text(msg);
    });
  });
</script>

  </body>
</html>

服务器端代码

var app = require('express')();
var http = require('http').Server(app);
var httpk = require('http');
var io = require('socket.io')(http);
var nsp = io.of('/channel1');

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

nsp.on('connection', function(socket){

  nsp.emit('live-quote', 'Welcome User!');
  //Make a http call

  function test()
  {
    httpk.get("url-to-api", function(res) {
        var body = ''; // Will contain the final response

        res.on('data', function(data){
            body += data;
        });

        res.on('end', function() {
            var parsed = JSON.parse(body);
            console.log(parsed.johndoe.bid_price);
            return parsed.johndoe.bid_price;
        });
    });
  }

  setInterval(test,500);

  socket.on('disconnect', function(){
    console.log('1 user disconnected');
  });

});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

上面的代码我已经按照你的建议输入了。现在,我想添加如下内容:

setInterval(test,500);

function test (){
    http.get("url-for-api", function(res) {
        var body = ''; // Will contain the final response

            res.on('data', function(data){
            body += data;
        });

        // After the response is completed, parse it and log it to the console
        res.on('end', function() {
            var parsed = JSON.parse(body);
            console.log(parsed.johndoe.bid_price);
            data = parsed.johndoe.ask_price;

        });
    })
    // If any error has occured, log error to console
        .on('error', function(e) {
            console.log("Got error: " + e.message);
        });

}

目前还不完全清楚你在问什么,但我会试一试。

如果您希望能够 "push" 使用 socket.io 向客户端更新新股票,那么通常的做法是让客户端建立 socket.io 连接到您的服务器,然后您的服务器可以通过在服务器上执行 io.emit(msg, data) 向所有连接的客户端发布更新。这会将消息和数据发送到所有连接的客户端。

如果您希望将这些更新发送到网页,则将 Javascript 放入该网页,使 socket.io 连接到您的服务器,然后在该套接字上侦听来自服务器的适当消息。当它从服务器接收到消息时,它可以以您认为合适的任何方式将它们插入到页面中。

来自 socket.io doc pages 的客户端代码是客户端的典型代码:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io();
  socket.on('udpate', function (data) {
    console.log(data);
    // do something with the data here (like insert it into the web page)
  });
</script>

如果您必须告诉服务器您对哪些股票更新感兴趣以便仅将这些更新发送到客户端页面,那么您将需要在客户端和服务器上做更多的工作以允许服务器保持跟踪哪个连接对哪些更新感兴趣,并且只发送到正确的连接。您可以使用 socket.io 个房间来帮助管理它。客户端连接请求加入给定股票的房间,然后特定股票的股票更新仅发送给相应房间中的客户端。