2014-04-04 36 views
0

我相信sails.js中的套接字方法在過去幾個月中發生了變化。對最佳實踐應該是什麼有點困惑。Sails.js套接字 - 最佳實踐4/2014

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)

這裏是一個我的用戶控制器的副本項目,我已經在處理訂閱的線上發表評論。希望它可以幫助....

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

假設你想從通過插座上的代碼應該是這個樣子的前端

socket.get('/comment/subscribe', function serverResponse(data) { 
    // use data 
}) 

在服務器端在commentController

服務器獲取一些數據
subscribe: function(req, res) { 
    //some logic 
    res.json({ 
     data: 'some random data' 
    }); 
} 

這取決於你想要做什麼,但這是基本結構。另外請注意,風帆使用藍圖,這是一種方式來使一些基本的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; 

     } 

    });