Sails.js套接字 - 最佳实践4/2014

时间:2014-04-04 06:22:55

标签: sails.js

我相信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");
      }
    }
  });
});

我认为这种方法已被弃用。什么是最好的语法套接字订阅?

此外 - 我是否可以订阅模型的特定条件,在这种情况下是特定评论或其他属性?

2 个答案:

答案 0 :(得分:1)

默认情况下,当您申请模型时,您将订阅它。如果您使用蓝图,则这是默认设置。没有必要明确订阅。

但是,如果您正在制作自己的控制器方法。您需要订阅套接字请求以在服务器端手动记录更新。

假设您有User型号......

要通知套接字所有created个事件,请致电User.watch(req) 对于updateddestroyed,请致电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 
})
在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;

      }

    });