Подтвердить что ты не робот

Как я могу подписаться на экземпляр модели в Sails.JS?

Я пытаюсь использовать описанную здесь функцию подписки . Однако при редактировании /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 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 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?

4b9b3361

Ответ 1

Чтобы подписаться на экземпляр модели, я использую следующий шаблон Модель реального времени, некоторые из которых находятся на клиенте, а некоторые - на сервере. Имейте в виду, что клиент не может просто подписаться на себя - вам нужно отправить запрос на сервер, чтобы он знал, что вы хотите подписаться - это единственный способ сделать это безопасно. (например, вы можете публиковать уведомления с конфиденциальной информацией - вы хотите убедиться, что подключенный сокет имеет разрешение видеть эту информацию, прежде чем подписывать их на нее.)

Я собираюсь использовать пример приложения с моделью пользователя. Допустим, я хочу уведомлять людей, когда существующие пользователи входят в систему.

Клиентская сторона (часть I)

На стороне клиента для простоты Im будет использовать существующий файл app.js в папке /assets/js (или /assets/linker/js, если вы использовали переключатель --linker при создании приложения.)

Чтобы отправить запрос сокета на сервер в assets/js/app.js, я собираюсь использовать метод socket.get(). Этот метод имитирует функциональность запроса "получить" AJAX (т.е. $.get()), но использует сокеты вместо HTTP. (FYI: у вас также есть доступ к 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
  });

//...

Серверная сторона (часть I)

В действии 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);
    });
  }

//...

Назад на стороне клиента (часть II)...

Я хочу, чтобы сокет "прослушивал сообщения, которые я собираюсь отправить с сервера. Для этого используйте:

 
// 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
  });

// ...

Назад на стороне сервера (часть II)...

Наконец, я начну отправлять сообщения на стороне сервера, используя: User.publishUpdate(id);

 
// api/SessionController.js

//...
  // User session is created
  create: function(req, res, next) {

    User.findOneByEmail(req.param('email'), function foundUser(err, user) {
      if (err) return next(err);

      // Authenticate the user using the existing encrypted password...
      // If authenticated log the user in...

      // Inform subscribed sockets that this user logged in
      User.publishUpdate(user.id, {
        loggedIn: true,
        id: user.id,
        name: user.name,
        action: ' has logged in.'
      });
    });
  }
//...

Вы также можете проверить Построение приложения Sails: Ep21 - Интеграция socket.io и парусов с пользовательскими действиями контроллера с использованием событий в режиме реального времени для получения дополнительной информации.