如何在Sails.JS中订阅模型实例?

时间:2013-11-06 17:40:46

标签: javascript socket.io sails.js

我正在尝试使用订阅功能described here。但是,在编辑/assets/js/app.js时,我收到此错误:

Uncaught ReferenceError: Room is not defined 

所以,我不完全确定为什么,但它找不到我的模型。这是我的代码:

Room.subscribe(req, [{id: "5278861ab9a0d2cd0e000001"}], function (response) {
  console.log('subscribed?');
  console.log(response);
});

,这是在app.js

的上下文中
(function (io) {

  // as soon as this file is loaded, connect automatically, 
  var socket = io.connect();
  if (typeof console !== 'undefined') {
    log('Connecting to Sails.js...');
  }

  socket.on('connect', function socketConnected() {

    // Listen for Comet messages from Sails
    socket.on('message', function messageReceived(message) {

      ///////////////////////////////////////////////////////////
      // Replace the following with your own custom logic
      // to run when a new message arrives from the Sails.js
      // server.
      ///////////////////////////////////////////////////////////
      log('New comet message received :: ', message);
      //////////////////////////////////////////////////////

    });


    ///////////////////////////////////////////////////////////
    // Here's where you'll want to add any custom logic for
    // when the browser establishes its socket connection to 
    // the Sails.js server.
    ///////////////////////////////////////////////////////////
    log(
        'Socket is now connected and globally accessible as `socket`.\n' + 
        'e.g. to send a GET request to Sails, try \n' + 
        '`socket.get("/", function (response) ' +
        '{ console.log(response); })`'
    );
    ///////////////////////////////////////////////////////////

    // This is the part I added: 
    Room.subscribe(req, [{id: "5278861ab9a0d2cd0e000001"}], function (response) {
      console.log('subscribed?');
      console.log(response);
    });
    //


   });


  // Expose connected `socket` instance globally so that it's easy
  // to experiment with from the browser console while prototyping.
  window.socket = socket;


  // Simple log function to keep the example simple
  function log () {
    if (typeof console !== 'undefined') {
      console.log.apply(console, arguments);
    }
  }


})(

我是以正确的方式来做这件事的吗?我应该将此直接存储在 app.js中吗?

1 个答案:

答案 0 :(得分:28)

要订阅模型实例,我使用以下实时模型事件模式,其中一些模式驻留在客户端上,一些模式驻留在服务器上。请记住,客户端不能只订阅自己 - 您必须向服务器发送请求,让它知道您喜欢订阅 - 这是安全地执行此操作的唯一方法。 (例如,您可能希望发布包含敏感信息的通知 - 您希望确保连接套接字有权在订阅它之前查看该信息。)

我将使用带有User模型的应用程序示例。假设我想在现有用户登录时通知他们。

客户端(第一部分)

在客户端,为简单起见,如果您使用{{1},我将使用app.js文件夹(或/assets/js文件夹中的现有/assets/linker/js文件在构建应用程序时切换。)

要将我的套接字请求发送到--linker内的服务器,我将使用assets/js/app.js方法。此方法模仿AJAX“get”请求(即socket.get())的功能,但使用套接字而不是HTTP。 (仅供参考:您还可以访问$.get()socket.post()socket.put()

代码看起来像这样:

 socket.delete()

服务器端(第一部分)

// Client-side (assets/js/app.js) // This will run the `welcome()` action in `UserController.js` on the server-side. //... socket.on('connect', function socketConnected() { console.log("This is from the connect: ", this.socket.sessionid); socket.get(‘/user/welcome’, function gotResponse () { // we don’t really care about the response }); //... 中的welcome()操作,现在,我们实际上可以使用UserController.js方法将此客户端(套接字)订阅到通知。

 User.subcribe()

回到客户端(第二部分)......

我希望套接字'监听'我要从服务器发送的消息。为此,我将使用:

 
// api/UserController.js

//...
  welcome: function (req, res) {
    // Get all of the users
    User.find().exec(function (err, users) {
      // Subscribe the requesting socket (e.g. req.socket) to all users (e.g. users)
      User.subscribe(req.socket, users);
    });
  }

//...

回到服务器端(第二部分)......

最后,我将开始使用: // Client-side (assets/js/app.js) // This will run the `welcome()` action in `UserController.js` on the backend. //... socket.on('connect', function socketConnected() { console.log("This is from the connect: ", this.socket.sessionid); socket.on('message', function notificationReceivedFromServer ( message ) { // e.g. message === // { // data: { name: ‘Roger Rabbit’}, // id: 13, // verb: ‘update’ // } }); socket.get(‘/user/welcome’, function gotResponse () { // we don’t really care about the response }); // ...

发送服务器端的消息
 User.publishUpdate(id);

您还可以查看Building a Sails Application: Ep21 - Integrating socket.io and sails with custom controller actions using Real Time Model Events以获取更多信息。