Sails.js插座-最佳实践4/2014

Sails.js插座-最佳实践4/2014,sails.js,Sails.js,我相信在过去的几个月里,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

我相信在过去的几个月里,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");
      }
    }
  });
});
我认为这种方法是不可取的。什么是最佳语法套接字订阅


另外-我是否能够订阅模型的特定标准,在本例中是特定注释或其他属性?

默认情况下,当您请求模型时,您将订阅该模型。如果您使用的是蓝图,那么这是默认设置。不需要显式订阅

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

假设您有一个
用户
型号

要通知套接字所有创建的
事件,请调用
User.watch(req)
对于
更新的
销毁的
调用
用户。订阅(请求,记录)

这是我的项目用户控制器的副本,我在处理订阅的行上添加了注释。希望能有帮助

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

假设您希望通过套接字从服务器获取一些数据,那么前端的代码应该是这样的

socket.get('/comment/subscribe', function serverResponse(data) {
  // use data 
})
在commentController的服务器端

subscribe: function(req, res) {
    //some logic
    res.json({
      data: 'some random data'
    });
}
这取决于你到底想做什么,但这是基本结构。还请注意,sails使用蓝图,这是一种使一些基本CRUD路线可用的方法,而无需在控制器中对其进行编码。更多信息请参见:

关于问题中以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;

      }

    });