我正在使用socket.io构建一个应用程序来匹配'用户实时。我们的想法是user a
按下要匹配的按钮,然后当user b
发出匹配请求时,通过向两个客户端发送io消息来匹配两者。我正在使用AngularJS以及ui-router和bt-fords socket.io。
客户端在输入控制器时发出请求,如下所示:
lunchrControllers.controller('UserMatchingController', ['$state', 'socket', 'authService',
function ($state, socket, authService) {
socket.emit('match', {userEmail: authService.currentUser()});
var currEmail = authService.currentUser();
// only want to catch emits suffixed with the users email
socket.on('matched' + currEmail, function (data) {
$state.go('users.matched', {name: data.name})
});
}]);
其中authService
用于保留当前登录用户的电子邮件。在服务器端,我有代码使用mongoose进行一堆数据库工作(它绝对可以清理):
var mongoose = require('mongoose');
var User = mongoose.model('User');
module.exports = function(socket) {
socket.on('match', function(data){
User.findOne({email: data.userEmail}, function(error, user) {
if(error){
return
}
user.wantsToBeMatched = true;
user.save(function(err){
// bleh
});
});
User.find({email: {'$ne': data.userEmail }, wantsToBeMatched: true}, function(error, users){
if(error || users.length == 0){
//bleh
return
}
console.log(users);
User.findOne({email: data.userEmail}, function(error, currentUser) {
if(error) {
return;
}
// there is another user who wants to be matched
users[0].wantsToBeMatched = false;
users[0].matchedWith = currentUser.firstname;
currentUser.wantsToBeMatched = false;
currentUser.matchedWith = users[0].firstname;
users[0].save(function() {});
currentUser.save(function() {});
console.log("I'm gonna emit " + ('matched' + currentUser.email) + " with name = " + currentUser.matchedWith);
console.log("I'm gonna emit " + ('matched' + users[0].email) + ' with name = ' + users[0].matchedWith);
socket.emit('matched' + users[0].email, {name: users[0].matchedWith});
socket.emit('matched' + currentUser.email, {name: currentUser.matchedWith});
});
});
})
};
问题是只有第二个用户(在此示例中为user b
)才能请求匹配从服务器接收socket.emit
。我已经尝试更改服务器中发出消息的顺序,但没有帮助。控制台日志记录完全符合我的期望:
I'm gonna emit matcheda@a.com with name = b
I'm gonna emit matchedb@b.com with name = a
我尝试过使用不同的浏览器,使用隐身功能,将代码放在EC2实例上,让朋友在不同的IP上试用,每次都获得相同的结果。
基本上,问题归结为以下代码未在user a
:
socket.on('matched' + currEmail, function (data) {
$state.go('users.matched', {name: data.name})
});
答案 0 :(得分:0)
想出来。这是我需要做出的改变:
socket.broadcast.emit('matched' + users[0].email, {name: users[0].matchedWith});
我错过了broadcast
这个词。我之前的代码无效的原因是(根据我对socket.io的新理解)socket.emit
仅向触发socket.on
的客户端发送消息。要发送给其他客户端,需要广播该消息。