Ответ 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 и парусов с пользовательскими действиями контроллера с использованием событий в режиме реального времени для получения дополнительной информации.