События модели в реальном времени в Sails.js 0.10-rc5

Я экспериментировал с созданием некоторых функций реального времени, используя Sails.js версии 0.10-rc5 (в настоящее время бета-версия).

Чтобы добиться чего-либо, я следовал прекрасному руководству SailsCast по этому вопросу (ссылка на sailsCast) Это говорит о подписке к модели через действие «подписаться» в контроллере модели. Затем слушаете его на стороне клиента, ожидая, пока сервер отправит сообщения. Довольно просто, хотя я, кажется, не получаю никаких сообщений.

Я пытаюсь сделать это, чтобы получать обновления в режиме реального времени обо всем, что изменяется в моих пользовательских моделях, или если создаются новые. Таким образом, я могу отображать статус входа в систему и т. д. в режиме реального времени. Практически то же самое, что описано в SailsCast.

В моем терминале я получу две вещи, на которые стоит обратить внимание, первая из которых следующая:

debug: Deprecated:   `Model.subscribe(socket, null, ...)`
debug: See http://links.sailsjs.org/docs/config/pubsub
debug: (⌘ + double-click to open link from terminal)
debug: Please use instance rooms instead (or raw sails.sockets.*() methods.)

Похоже, что метод «подписаться» устарел. Может ли кто-нибудь сказать мне, правильно ли это, и сказать мне, как это исправить? Я проверял ссылку на документацию в отладочном сообщении, хотя она просто указывает мне на страницу глобальной документации. Я искал ответ в другом месте, но не нашел ничего полезного.

Второе сообщение, которое я получаю:

warn: You are trying to render a view (_session/new), but Sails doesn't support rendering views over Socket.io... yet!
You might consider serving your HTML view normally, then fetching data with sockets in your client-side JavaScript.
If you didn't intend to serve a view here, you might look into content-negotiation
to handle AJAX/socket requests explictly, instead of `res.redirect()`/`res.view()`.

Теперь я совершенно уверен, что это потому, что у меня есть политика isAuthenticated, добавленная ко всем моим контроллерам и действиям. Когда пользователь не аутентифицирован, он будет перенаправлен на сеанс/новую страницу. Кто-то должен войти в систему, чтобы иметь возможность использовать приложение. Когда я удаляю политику «isAuthenticated» из действия «подписано», предупреждения исчезают. Хотя это означает, что любой будет получать обновления через сокеты (когда я заставлю его работать), даже если они вышли из системы. - Я действительно не чувствую, что люди просто сидят на экране входа в систему, выуживая сообщения в реальном времени, которые предназначены только для пользователей, которые вошли в систему.

Может ли кто-нибудь помочь мне заставить работать обновления в реальном времени? Я был бы очень признателен!


person Lars Dol    schedule 02.05.2014    source источник


Ответы (1)


Что касается сообщений сокетов, которые не были получены, проблема в том, что вы следуете руководству для v0.9.x, но используете бета-версию Sails, в которой PubSub претерпел некоторые изменения. Это описано в этом ответе о том, что события "создать" не были получены .

Ваша вторая проблема вообще не касается сокетов; вам просто нужно немного пересмотреть свою архитектуру. Если вы хотите использовать запросы сокетов для входа пользователей, вам нужно быть более осторожным с их перенаправлением, потому что, как говорится в сообщении, вы не можете отображать представление через сокет. Технически вы можете отправить кучу HTML обратно клиенту через сокет и заменить им текущую страницу, но это не очень хорошая практика. Вместо этого вы можете в своей политике isAuthenticated проверить, выполняется ли запрос через сокеты (используя req.isSocket), и если это так, отправьте обратно сообщение, которое внешний интерфейс может интерпретировать как означающее "вы должны перенаправить на страницу входа сейчас". Что-то вроде:

module.exports = function (req, res, next) {

    if ([your auth logic here]) {
        return next();
    }
    else {
        if (req.isSocket) {
            return res.json({status: 403, redirectTo: "/session/new"});
        } else {
            return res.redirect("/session/new");
        }
    }
}
person sgress454    schedule 02.05.2014
comment
Большое спасибо! - Особенно ссылка на документы по миграции, вероятно, будет очень полезна в будущем. Таких еще не встречал :) - person Lars Dol; 03.05.2014