将 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
感谢大家点赞!
在 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
感谢大家点赞!