实时将数据输出到浏览器,而无需重新启动节点js,websocket?

时间:2019-01-19 07:33:24

标签: html node.js websocket

我需要实时获取货币报价,而无需重新加载页面和单击按钮。

为解决此问题,我们不得不采用以下技术:node js,websocket.io,Redis,数据供体API。

在控制台中,我得到以下数据:

{"symbol": "EURUSD", "bid": 1.13624, "ask": 1.13624, "price": 1.13624}

事实上,一切正常,这就是我所需要的。但是,我无法弄清楚如何将相同的数据传输到浏览器,这样就可以了:

EURUSD | bid - 1.13624 | ask - 1.13624 | price - 1.13624

这是js代码:

const redis = require('redis');
const settings = {
    REDIS: {
        HOST: 'localhost'
    }
}
let redisClient = new redis.createClient(settings.REDIS);

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

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

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

function getQuote(symbol, callback) {
    redisClient.get(symbol, (error, quote) => {
        if (error) {
            throw new Error(error);
        }
        quote = JSON.parse(quote);
        callback(quote);
    });
}

setInterval(() => {
    getQuote('EURUSD', (q) => {
        const formattedQ = `${q.SYMBOL} | bid - ${q.bid} | ask - ${q.ask} | price - ${q.price}`;
        console.log(formattedQ);
    });
}, 10);

io.on('connection', function(socket){
    socket.on('get_quote', function(msg){
        io.emit('get_quote', getQuote('EURUSD', (q) => /* ??? what to insert here? -> (formattedQ) ??? */));
    });
});

和HTML文件:

<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();
    socket.on('get_quote', function(msg){
      // ??? what to insert here to update quotes without rebooting ???
    });
  });
</script>

1 个答案:

答案 0 :(得分:0)

我认为更合适的方法是按原样发送json,并在客户端中对其进行格式化。

/* redis connection code */
setInterval(() => {
    getQuote('EURUSD', (q) => {
        const formattedQ = `${q.SYMBOL} | bid - ${q.bid} | ask - ${q.ask} | price - ${q.price}`;
        console.log(formattedQ);
    });
}, 10);

更新

我正在修改答案,因为我认为显示一段我认为可行的代码会更容易。 为了将数据从服务器发送到客户端,您应该使用io.emit()函数,但是您将其包装在socket.on('get_quote')中。基本上会发生的情况是,只有在收到消息时才会发出新消息(导致死锁)。

我相信该代码段应该可以工作:

io.on('connection', function(socket){
    setInterval(() => {
        getQuote('EURUSD', (q) => {
            io.emit('get_quote', q);
        });
    }, 10);
});

这将在与服务器建立连接时初始化一个间隔,并每10秒发出一个新的q
然后,在HTML文件中,您应该收到q(以JSON形式),并按照您选择的方式对其进行格式化:

socket.on('get_quote', function(msg){
    console.log(`${msg.SYMBOL} | bid - ${msg.bid} | ask - ${msg.ask} | price - ${msg.price}`);
});