Sails.js IO.socket没有触发

时间:2015-12-08 16:10:23

标签: javascript angularjs node.js sockets sails.js

我有一个AngularJS应用程序,我试图在创建/删除数据库中的项目时触发套接字。我使用自定义控制器方法('socketCreate')从使用$ resource切换到io.socket.post(),但不确定为什么我的套接字回调都没有被触发。

Sails JS控制台记录新用户,创建新用户,angular从套接字获取数据并刷新列表。这一切都正常,但是io.socket.on回调不会触发。

我没有得到eventIdentity正确吗?

角度控制器:

$scope.newUser = function() {
    io.socket.post('/users/socketCreate', {name: $scope.temp_user.name}, function( data, jwres ) {
        $scope.refreshUsers();
        $scope.temp_user = {};
    });
};

if( !io.socket.newUserListen ) {
    io.socket.newUserListen = true;
    console.log( io.socket.newUserListen );

    io.socket.on( 'users', function onServerSentEvent( msg ) {
        console.log( 'users', msg );
    });

    io.socket.on( 'user', function onServerSentEvent( msg ) {
        console.log( 'user', msg );
    });
}

Sails Controller:

module.exports = {
    socketCreate: function( req, res ) {
        var newName = req.param( 'name' );
        if( newName && req.isSocket ) {
            Users.create({ name: newName }).exec(function created( err, newGuy ){
                Users.publishCreate({
                    id:newGuy.id,
                    name: newGuy.name
                });
                console.log( 'User Created...' );
                res.ok( newGuy );
            })
        } else if( req.isSocket ) {
            Users.watch( req );
        } else {
            console.log( newName, req.isSocket );
        }

    }
}

1 个答案:

答案 0 :(得分:1)

事件回调未触发的原因是您需要订阅由Sails自动生成的房间。一种方法是使用Sails蓝图。因此,如果将其添加到Angular控制器,您应该看到事件触发:

 io.socket.get('/users', function(data) {});

通过发出 get 套接字请求,您正在执行蓝图:find动作,自动将套接字订阅到房间。或者,您可以创建另一个使用.watch()方法执行相同操作的操作:

join: function(req, res) {
  Users.watch(req);

  return res.ok();
},

然后从控制器调用它:

io.socket.put('/users/join', function(data) {});