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) 对于updateddestroyed,请致电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的主要内容,如果未能解决你的问题,请参考以下文章

Sails.js 对套接字请求的授权

ZeroMQ 和 Sails.js

使用node.js套接字客户端向sails.js(0.11.x)发出事件[重复]

使用套接字保持 Sails.js 集合的客户端同步

如何在sails.js 中的SocketIO 握手期间修复“此套接字没有可用的有效会话”?

将socket.io与sails js一起使用