Вывод данных в реальном времени в браузер без перезапуска узла js, websocket? - PullRequest
0 голосов
/ 19 января 2019

Мне нужно получать котировки валют в режиме реального времени, без перезагрузки страницы и нажатия кнопок.

Чтобы решить эту проблему, нам пришлось прибегнуть к следующим технологиям: узел 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 голосов
/ 19 января 2019

Я думаю, что более подходящим подходом было бы отправить 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);
});

Это будет инициализировать интервал при наличии соединения с сервером и выдавать новый q каждые 10 секунд.
Затем в вашем HTML-файле вы должны получить q (в форме JSON) и отформатировать его так, как вы выбрали:

socket.on('get_quote', function(msg){
    console.log(`${msg.SYMBOL} | bid - ${msg.bid} | ask - ${msg.ask} | price - ${msg.price}`);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...