将 0.9.16 升级到 1.3.5 时,带有回调的 SocketIO 发出失败

SocketIO emit with callback fails while upgrading 0.9.16 to 1.3.5

在 0.9.16 中,我使用 socket.emit 回调,以便聊天服务器 return 一些数据,我可以根据确认处理结果。但是在升级到 1.3.5 之后,我在控制台中发现了这样的错误

Uncaught TypeError: Cannot read property 'apply' of 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[的控制台错误=32=]

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];
};

伙计们,请帮忙

编辑:这不是回调在 socket.io v1.3.5 中的工作方式。事实上,emit 函数根本不接受任何回调。

我猜您想向 发送节点 发送确认消息,表明其消息已收到。为此,您需要从服务器进行另一个 socket.emit 调用(在服务器上,套接字变量表示 到网络中特定节点 的连接,而在客户端上, socket 变量表示 到服务器的连接 )。因此,在客户端,您需要使用 socket.on 来处理确认,这是您放置回调的地方。

要向网络中的所有节点广播确认,您应该使用io.emit

使用 socket.io 的聊天应用程序代码示例可用 here

我终于解决了这个问题。这是我的代码中的一个错误,我在聊天服务器中进行了多次回调。 像这样:

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
  })

});

In the previous versions it was a warning, now its an error !! That's it. So please avoid multiple callbacks

请看看这个,可能对每个 nodejs 开发人员都有用: http://www.toptal.com/nodejs/top-10-common-nodejs-developer-mistakes/#remote-developer-job

感谢大家点赞!