我相信sails.js中Sockets的方法在过去几个月中发生了变化。对最佳实践应该是什么感到困惑。
socket.get('/comment/subscribe', function () {
socket.on('comment', function(obj) {
if (obj.verb == 'created') {
var data = obj.data;
if (data.project == 1) {
// This adds it to a visual list.
addComment("data.content");
}
}
});
});
我认为这种方法已被弃用。什么是最好的语法套接字订阅?
此外 - 我是否可以订阅模型的特定条件,在这种情况下是特定评论或其他属性?
答案 0 :(得分:1)
默认情况下,当您申请模型时,您将订阅它。如果您使用蓝图,则这是默认设置。没有必要明确订阅。
但是,如果您正在制作自己的控制器方法。您需要订阅套接字请求以在服务器端手动记录更新。
假设您有User
型号......
要通知套接字所有created
个事件,请致电User.watch(req)
对于updated
和destroyed
,请致电User.subscribe(req, records)
这是我的项目用户控制器的副本,我已经在处理订阅的行上添加了注释。希望它有所帮助....
UserController = {
find: (req, res) ->
User.watch(req) // Subscription
if req.params.all().id
query = User.findOne(id: req.params('id'))
else
query = User.find()
query.exec((err, records) =>
return res.send(500, err) if (err)
User.subscribe(req, records) // Subscription
return res.json(records)
)
create: (req, res) ->
User.create(req.body).exec((err, record) =>
return res.send(500, err) if (err)
User.publishCreate(record, record.toJSON()) // Subscription
return res.json(record.toJSON())
)
update: (req, res) ->
User.update(req.params('id'), req.body).exec((err, records) =>
return res.send(500, err) if (err)
return res.notFound() if _.isEmpty(records)
record = _.first(records)
User.publishUpdate(record.id, record.toJSON()) // Subscription
return res.json(record.toJSON())
)
destroy: (req, res) ->
User.destroy(req.params('id')).exec((err, records) =>
return res.send(500, err) if (err)
return res.notFound() if _.isEmpty(records)
record = _.first(records)
User.publishDestroy(record.id) // Subscription
return res.send(204, null)
)
me: (req, res) ->
User.findOne(
id: req.session.user_id
).done((err, user) =>
User.subscribe(req, user) // Subscription
return res.json(user)
)
}
module.exports = UserController
答案 1 :(得分:1)
假设您想通过套接字从服务器获取一些数据,代码应该在前端看起来像这样
socket.get('/comment/subscribe', function serverResponse(data) {
// use data
})
subscribe: function(req, res) {
//some logic
res.json({
data: 'some random data'
});
}
这取决于你想要做什么,但这是基本结构。另请注意,sails使用蓝图,这是一种使一些基本CRUD路线可用的方法,无需在控制器中编码它们。更多信息:http://irlnathan.github.io/sailscasts/blog/2014/01/17/sailscasts-answers-ep8-how-do-blueprint-actions-and-blueprint-routes-work-in-sails/
关于以socket.on开头的问题中的代码部分,这是客户端上的事件侦听器,侦听服务器发送一些数据。例如
socket.on('room', function messageReceived(message) {
switch (message.verb) {
case 'created':
addRoom(message.data);
break;
case 'addedTo':
postStatusMessage('room-messages-'+message.id, $('#user-'+message.addedId).text()+' has joined');
increaseRoomCount(message.id);
break;
case 'removedFrom':
postStatusMessage('room-messages-'+message.id, $('#user-'+message.removedId).text()+' has left');
decreaseRoomCount(message.id);
break;
case 'destroyed':
removeRoom(message.id);
break;
case 'messaged':
receiveRoomMessage(message.data);
default:
break;
}
});