Sails.js 套接字 - 最佳实践 4/2014
Posted
技术标签:
【中文标题】Sails.js 套接字 - 最佳实践 4/2014【英文标题】:Sails.js Sockets - Best Practices 4/2014 【发布时间】:2014-04-04 06:22:54 【问题描述】:我相信在sails.js 中处理套接字的方法在过去几个月中发生了变化。对最佳实践应该是什么感到有些困惑。
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");
);
);
我相信这种方法已被弃用。什么是最好的语法套接字订阅?
另外 - 我是否能够订阅模型的特定标准,在这种情况下是特定的评论或其他属性?
【问题讨论】:
【参考方案1】:默认情况下,当您请求模型时,您将订阅它。如果您使用蓝图,这是默认设置。无需显式订阅。
但是,如果您正在制作自己的控制器方法。您需要订阅套接字请求才能在服务器端手动记录更新。
假设您有一个User
模型...
要通知套接字所有created
事件调用User.watch(req)
对于updated
和destroyed
,请致电User.subscribe(req, records)
这是一个项目的用户控制器的副本,我已将 cmets 放在处理订阅的行上。希望对你有帮助....
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
【讨论】:
【参考方案2】:假设你想通过套接字从服务器获取一些数据,代码在前端应该是这样的
socket.get('/comment/subscribe', function serverResponse(data)
// use data
)
commentController 中的服务器端
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;
);
【讨论】:
以上是关于Sails.js 套接字 - 最佳实践 4/2014的主要内容,如果未能解决你的问题,请参考以下文章
使用node.js套接字客户端向sails.js(0.11.x)发出事件[重复]