第二个socket.io在服务器端发出没有被angular接收

时间:2015-03-10 21:42:49

标签: angularjs node.js socket.io

我正在使用socket.io构建一个应用程序来匹配'用户实时。我们的想法是user a按下要匹配的按钮,然后当user b发出匹配请求时,通过向两个客户端发送io消息来匹配两者。我正在使用AngularJS以及ui-routerbt-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})
});

1 个答案:

答案 0 :(得分:0)

想出来。这是我需要做出的改变:

socket.broadcast.emit('matched' + users[0].email, {name: users[0].matchedWith});

我错过了broadcast这个词。我之前的代码无效的原因是(根据我对socket.io的新理解)socket.emit仅向触发socket.on的客户端发送消息。要发送给其他客户端,需要广播该消息。