Использование socket.io с парусами js

В то время как для использования сокетов была очень хорошая документация, благодаря Irl Nathon Sails Cast series. Все изменилось в v0.11, при этом команда команд парусов и похороны подпрограммы socket.io.

Сайт парусов, например. SailsSocket безумно кратким, говоря, что делать, но не как и где это делать, или мне нужно npm или bower. Это особенно расстраивало попытку использования sails.config.sockets, о котором говорилось на сайте парусов. Который я даже не могу найти в моих каталогах v0.11.

Сначала я хотел бы знать, как и где создать собственный ответ на io.socket.get или .post или что-то еще. Прямо сейчас, когда я получаю что-то вроде:

`io.socket.request({
  method: 'get',
  url: '/sites/2',
  params: {},
  headers: {}
},function serverResponded(body, JWR){console.log("Body: ", JSON.stringify(body,null, 4)); console.log(' JWR: ', JWR.body)});'

Я возвращаюсь:

undefined
VM1149:7 "Not implemented in core yet"
VM1149:7  JWR:  Not implemented in core yet

Я вижу сайты, вызываемые в консоли парусов, но ничего не происходит.

Я считаю, что это связано с тем, что я определил свои собственные маршруты и имею свою собственную функцию find: на моем контроллере сайта, и мне вручную нужно что-то вставить в сокет на стороне сервера. Но я смущен относительно того, как я должен вызвать целую страницу с HTTP и только таблицы с socket.io в той же самой процедуре контроллера.

  • Где я могу написать свои собственные низкоуровневые процедуры socket.io, которые можно вызывать с веб-страницы?

  • Я все еще делаю это в файле app.js?

Sails Cast показала, что это делается там, но снова все изменилось.

Ответы

Ответ 1

Пароли "виртуальные запросы" (то, что они называют этим HTTP-ish-запросом на основе socket.io) обычно используются для извлечения или отправки данных JSON на сервер. Кроме того, если клиентская сторона script создает виртуальный запрос, сервер может добавить или удалить запрашивающий сокет в/из комнат.

Обратите внимание, что использование "виртуального метода" в конечном итоге приведет к одному и тому же действию контроллера, но установит req.isSocket = true.

Этот пример представляет собой представление, которое отображает представление для запросов, требующих HTML, но возвращает данные JSON для запросов на основе сокетов:

...
// 'get /sites/:id': 'SomeController.showSite' (should be put in your `routes.js`)
showSite: function(req, res) {
  // load something from the database
  Site.findOne(req.param('id')).exec(function(err, site) {
    // handler errors (same for HTTP or sockets)
    if (err) return res.serverError();
    if (!site) return res.notFound();

    if (req.isSocket) return res.json(site); // render JSON response for our `site` object
    else return res.view('sites/show', {site: site}); // render an HTML view
  });
}

Что касается низкоуровневого socket.io, паруса предоставляют глобальную переменную io (from sails.io.js), которая является экземпляром SailsSocket. Он позволяет создавать "виртуальные запросы" HTTP-ish. Подробнее здесь (хотя, похоже, вы уже прочитали все, что нужно прочитать о SailsSocket:). Вы можете получить доступ к базовому клиенту socket.io с помощью io.socket._raw.

// do this in the browser. 
// sails.io.js should be included in layout.ejs by default.
io.socket.get('/site/2', console.log); // "virtual request"
// neat little trick     ^^^^^^^^^^^     for testing :)
var rawIO = io.socket._raw;
rawIO.emit('some:event', "using native socket.io");

Надеюсь, это поможет!