我有一个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 );
}
}
}
答案 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) {});