Socket.io — отправка данных из потока толкателя клиенту

Я пытаюсь отправить поток потребляемых данных через pusher-client-node на клиент, использующий Socket.IO.

Я получаю свои данные в Node.JS следующим образом:

var API_KEY = 'cb65d0a7a72cd94adf1f';
var pusher = new Pusher(API_KEY, {
    encrypted: true
});
var channel = pusher.subscribe("ticker.160");
channel.bind("message", function (data) {
    //console.log(data);
});

Мои данные, которые поступают постоянно, выглядят так:

{ channel: 'ticker.160',
  trade: 
   { timestamp: 1420031543,
     datetime: '2014-12-31 08:12:23 EST',
     marketid: '160',
     topsell: { price: '0.00007650', quantity: '106.26697381' }}

Мой код Socket.IO выглядит так:

/**
 * Socket.io
 */
var io = require("socket.io").listen(server, {log: true});
var users = [];

var stream = channel.bind("message", function (data) {
    console.log(data);
});

io.on("connection", function (socket) {
    // The user it's added to the array if it doesn't exist
    if(users.indexOf(socket.id) === -1) {
        users.push(socket.id);
    }

    // Log
    logConnectedUsers();

    socket.emit('someevent', { attr: 'value' } )

    stream.on("newdata", function(data) {
        // only broadcast when users are online
        if(users.length > 0) {
            // This emits the signal to the user that started
            // the stream
            socket.emit('someevent', { attr: 'value' } )

        }
        else {
            // If there are no users connected we destroy the stream.
            // Why would we keep it running for nobody?
            stream.destroy();
            stream = null;
        }
    });

    // This handles when a user is disconnected
    socket.on("disconnect", function(o) {
        // find the user in the array
        var index = users.indexOf(socket.id);
        if(index != -1) {
            // Eliminates the user from the array
            users.splice(index, 1);
        }
        logConnectedUsers();
    });
});

// A log function for debugging purposes
function logConnectedUsers() {
    console.log("============= CONNECTED USERS ==============");
    console.log("== :: " + users.length);
    console.log("============================================");
}

Я новичок в Node.JS и Socket.IO и изо всех сил пытаюсь использовать свой поток pusher в Node.JS. Поэтому мой вопрос: как связать мой код Socket.IO с моим кодом Pusher?


person Carol.Kar    schedule 31.12.2014    source источник
comment
Библиотека Pusher Node, на которую вы ссылаетесь (npmjs.com/package/pusher), предназначена для публикации информации. для Pusher и не для потребления данных. Код, который вы предоставили после того, как я получил свои данные в nodejs следующим образом: недействителен для библиотеки, на которую вы ссылались. Этот код будет работать только в веб-браузере при использовании библиотеки Pusher JS: github.com/pusher/pusher- js   -  person leggetter    schedule 06.01.2015
comment
@leggetter Спасибо за ответ! Тем не менее, я запускаю сценарий толкателя в том же экземпляре nodeJS, что и при попытке соединения socket.io, и я постоянно получаю данные...   -  person Carol.Kar    schedule 06.01.2015
comment
Является ли библиотека Node.js, на которую вы ссылались в вопросе (npmjs.com/package/pusher) неправильно? Следующая библиотека предлагает API, который вы показываете в своем вопросе: github.com/dirkbonhomme/pusher- клиент-узел   -  person leggetter    schedule 07.01.2015
comment
@leggetter Мне очень жаль, я думал, что эта библиотека такая же, как у меня на github. Вы совершенно правы!!! Эта github.com/dirkbonhomme/pusher-client-node — это библиотека, которую я использовал для подписка на сервис пушеров.   -  person Carol.Kar    schedule 07.01.2015


Ответы (1)


Вам нужно использовать socket/io room...

сервер:

var channel = pusher.subscribe("ticker.160"); //subscribe to pusher

//pass messages from pusher to the matching room in socket.io
channel.bind("message", function (data) {
  io.to('ticker.160').emit('room-message', {room:'ticker.160', data:data});
});

...

io.on("connection", function (socket) {
  ...
  socket.on('join', function(room){
    socket.join(room);
  });
  socket.on('leave', function(room){
    socket.leave(room);
  });
});

клиент:

io.emit('join','ticker.160');
io.on('room-message', function(message){
  switch(message.room) {
    case 'ticker.160': return doSomething(message.data);
    ...
  }
});
person Tracker1    schedule 06.01.2015
comment
Согласно моему комментарию к вопросу, var channel = pusher.subscribe("ticker.160") недействителен для библиотеки Pusher Node.js, на которую ссылался вопрос. Эта библиотека не предлагает функцию pusher.subscribe. Этот код больше похож на клиентский код. - person leggetter; 07.01.2015
comment
@leggetter спасибо за упоминание, добавил примечание внизу ... стыдно видеть библиотеки JS в наши дни, которые не публикуются в npm с поддержкой node.js из коробки. - person Tracker1; 08.01.2015
comment
@mrquad пояснил, что github.com/dirkbonhomme/pusher-client-node на самом деле используется и действительно предлагает клиентские функции, например возможность subscribe вести каналы и получать события на сервере. Итак, ваш ответ кажется правильным. - person leggetter; 08.01.2015