Подтвердить что ты не робот

Ошибка SocketIO с обратным вызовом при обновлении 0.9.16 до 1.3.5

В 0.9.16 я использую socket.emit с обратным вызовом, чтобы сервер чата возвращал некоторые данные, и я могу обрабатывать результат в соответствии с подтверждением. Но после обновления до 1.3.5 я нашел ошибку в консоли, подобную этой

Uncaught TypeError: Невозможно прочитать свойство "apply" из undefined.

Я сделал что-то вроде этого,

Из веб-страницы

socket.emit('userToUser', { 'usename': 'John',
'message': 'hi'
}, function(callback){
//callback handled
});

Чат-сервер

socket.on('userToUser', function(content, callback){
//do something
if(callback) return callback({'result':'success', 'messageid':content.messageid, 'chatid':content.chatid});
});

Когда я удалил обратный вызов с клиентской стороны, нет ошибки. Поэтому я считаю, что в обратном вызове будут внесены некоторые изменения.

Я получаю подтверждение, и чат работает нормально, но я беспокоюсь о консольной ошибке, которая приводит к socketio.js

Socket.prototype.onack = function(packet){
  debug('calling ack %s with %j', packet.id, packet.data);
  var fn = this.acks[packet.id];
  fn.apply(this, packet.data);
  delete this.acks[packet.id];
};

Ребята, пожалуйста, помогите

4b9b3361

Ответ 1

Наконец, я исправил проблему. Это было ошибкой в ​​моем коде, я сделал несколько обратных вызовов на чат-сервере. например:

socket.on('userToUser', function(content, callback){

  mysql.insertChat(content, function(err, data){
      return callback({'result':'1'})   //first callback
  })  
  sendToUser(content, function(errm successData){
      return callback({'result':'success','chatid':content.chatid});
      //second callback ->wrong
  })

});

В предыдущих версиях это было предупреждение, теперь его ошибка! Это. Поэтому, пожалуйста, избегайте нескольких обратных вызовов

Пожалуйста, взгляните на это и может быть полезно для каждого разработчика nodejs: http://www.toptal.com/nodejs/top-10-common-nodejs-developer-mistakes/#remote-developer-job

Спасибо, парни за выживание!

Ответ 2

EDIT: Это не так, как обратные вызовы работают с socket.io v1.3.5. Фактически, функция emit не принимает никаких обратных вызовов вообще.

Я предполагаю, что вы хотите отправить подтверждение отправителю node, что его сообщение получено. Для этого вам нужно сделать еще один вызов socket.emit с сервера (на сервере переменная сокета представляет соединение с определенным node в сети, тогда как на клиенте переменная сокета представляет соединение с сервером), Следовательно, на клиенте вам необходимо обработать подтверждение с помощью socket.on, в котором вы поместите свой обратный вызов.

Чтобы транслировать подтверждение на ВСЕ узлы в сети, вы должны использовать io.emit.

Пример кода для приложения чата с использованием socket.io доступен здесь.