Ошибка 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];
};
Ребята, пожалуйста, помогите
Ответы
Ответ 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 доступен здесь.