Клиентът Socket.io не работи правилно

Създадох приложение за чат, използвайки следното

  1. Релси
  2. Rabbitmq
  3. nodejs (с amqplib/callback_api и socket.io)

Имам следния код от страната на сървъра

var amqp = require('amqplib/callback_api');
var amqpConn = null;

var app = require('http').createServer()
var io = require('socket.io')(app);
var fs = require('fs');

io.on('connection', function (socket) {
        socket.emit('news/1', msg.content.toString());
        // socket.disconnect()
});

клиентска страна

<%= javascript_include_tag "http://localhost:53597/socket.io/socket.io.js"  %>
<script>



var socket = io('http://localhost:53597', {reconnect: true});

  socket.on('connect', function () {
    console.log('connected');

    socket.on('news/1', function (msg) {
      console.log('inside coming');
      console.log(msg);
    });
  });

</script>

Когато изпратя съобщение, съобщението е успешно изпратено до опашката и съобщенията са изпратени до сокета. Проблемът е, че мога да получавам съобщения, когато само опреснявам страницата и съобщенията не са изтрити.

Не мога да разбера какво не беше наред тук?


person empr    schedule 24.03.2017    source източник
comment
Обаждате ли се само на socket.emit по време на събитието за свързване или имате други обаждания към него, които не са показани в кода ви? В противен случай, както е написано, изглежда, че ще има само единично излъчване. Само за да тествате, можете да хвърлите socket.emit във функция, задействана от setInterval на сървъра. Освен това не съм сигурен дали съобщенията не се изтриват, не виждам нищо в кода, което да извършва изтриване.   -  person barry-johnson    schedule 24.03.2017
comment
@barry: Извиквате ли само socket.emit по време на събитието за свързване? да   -  person empr    schedule 24.03.2017
comment
Единственото ми изискване е да получа съобщението от опашката на rabbitmq и да изпратя съобщение към слушащи сокети. Имам проблем с клиента socket.io, но слушането работи добре, защото мога да покажа съобщения за грешка в конзолата на браузъра, когато спра nodejs сървъра.   -  person empr    schedule 24.03.2017
comment
Съжалявам за закъснението, тъй като бях навън по срещи. Във всеки случай, както казах, ако се обадите на socket.emit(...) само веднъж, той ще изпрати само едно съобщение. Не съм потребител на RabbitMQ, но от бърз поглед към документите изглежда, че поведението, което искате, ще бъде постигнато чрез извършване на socket.emit() извиквания от consume() манипулатора на канала.   -  person barry-johnson    schedule 25.03.2017
comment
@barry Съжалявам за забавянето, отговорът ви помогна, но мога да разбера, след като коригирам проблема. Благодаря   -  person empr    schedule 29.03.2017


Отговори (1)


В крайна сметка поправих проблема си, проблемът е, че поставих функцията emit в събитието за връзка, така че да мога да получа данни, когато е установена само връзка, връзката се установява при зареждане на страницата, което е причината да получавам данни, когато се зарежда само страница.

Имам следния код за излъчване на данни

io.sockets.emit('news/1', msg.content.toString());

person empr    schedule 29.03.2017