我是Sails.js的新手(使用0.10.5)并且我在使用sockets.io时遇到了一些障碍。
我只有一个用户CRUD系统,其管理页面可以监控用户创建,销毁,登录或注销的实时时间。
我用于chrome的实例:一个用于管理员,另一个用于隐身模式,用于另一个用户。
当我尝试创建一个用户然后,在同一页面中,我将他登出然后登录或试图摧毁他,一切正常。换句话说,如果我创建一个用户,则创建消息动词',更新'并且'销毁'效果非常好!甚至可以实时修改DOM。
我有一个型号:用户 还有两个控制器:SessionController和UserController。
当我登录时,'创建'调用SessionController中的方法。当我退出时,'销毁'调用SessionController的方法。两者都将publishUpdates发送到客户端。
当我创建用户时,UserController会发送publishCreate(以及销毁时的publishDestroy)。
但是,如果我关闭浏览器的两个页面(甚至打开服务器)并重新打开它们,则更新'消息不再传输。只有'创建'并且'销毁'动词仍然有效。 (用户一直都在订阅)。
有什么想法吗?
CODE
用户控制器
subscribe: function(req, res) {
if (req.isSocket) {
User.watch(req.socket);
res.send(200);
}
}
destroy: function(req, res, next) {
User.findOne(req.param('id'), function foundUser(err, user) {
User.destroy(req.param('id'), function userDestroyed(err) {
User.publishUpdate(user.id, {
name: user.name,
action: ' has been destroyed.'
});
User.publishDestroy(user.id);
});
res.redirect('/user');
});
},
create: function(req, res, next) {
var userObj = {
name: req.param('name'),
};
User.create( userObj, function userCreated (err, user) {
req.session.authenticated = true;
req.session.User = user;
user.online = true;
user.save(function(err, user) {
user.action = " signed-up and logged-in.";
User.publishCreate(user);
res.redirect('/user/show/' + user.id);
});
});
}
会话控制器
create: function(req, res, next) {
User.findOneByEmail(req.param('email'), function foundUser(err, user) {
req.session.authenticated = true;
req.session.User = user;
user.online = true;
user.save(function(err, user) {
User.publishUpdate(user.id, {
loggedIn: true,
id: user.id,
name: user.name,
action: ' has logged in.'
});
res.redirect('/user/show/' + user.id);
});
});
},
destroy: function(req, res, next) {
User.findOne(req.session.User.id, function foundUser(err, user) {
var userId = req.session.User.id;
User.update(userId, { online: false }, function(err) {
User.publishUpdate(userId, {
loggedIn: false,
id: userId,
name: user.name,
action: ' has logged out.'
});
req.session.destroy();
res.redirect('/session/new');
});
});
}
APP.JS
io.socket.on('connect', function socketConnected() {
io.socket.on('user', function (message) {
switch (message.verb) {
case 'created':
console.log('User ' + message.data.name + message.data.action);
break;
case 'updated':
console.log('User ' + message.data.name + message.data.action);
break;
case 'destroyed':
console.log('User ' + message.id + ' has been destroyed');
break;
default:
break;
}
});
socket.get('/user/subscribe');
});
政策
if (req.session.User) {
return ok();
} else {
res.send(403);
}