使用socket.io和sails js

use*_*963 15 websocket node.js socket.io sails.js

虽然曾经有过非常好的使用套接字的文档,但感谢Irl Nathon的Sails Cast系列.事情在v0.11中发生了变化,sails团队包装并掩埋了socket.io例程.

帆船网站,例如SailsS​​ocket令人抓狂,简单说明该做什么,但不知道如何或在哪里做,或者我需要npmbower的东西.尝试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)});'
Run Code Online (Sandbox Code Playgroud)

我回来了:

undefined
VM1149:7 "Not implemented in core yet"
VM1149:7  JWR:  Not implemented in core yet
Run Code Online (Sandbox Code Playgroud)

我可以看到在sails控制台中调用的站点,但没有任何结果.

我相信这是因为我已经定义了自己的路由,并且在我的站点控制器中有自己的find:function,我手动需要将某些东西推入服务器端套接字.但我很困惑,我是如何使用HTTP调用整个页面,而只是在同一控制器例程中使用socket.io调用表.

  • 我在哪里编写自己的低级socket.io例程,可以从网页调用?

  • 我还在app.js文件中做吗?

Sails Cast显示它在那里完成,但事情又发生了变化.

Con*_*oad 1

Sails“虚拟请求”(他们称之为基于 socket.io 的 HTTP-ish 请求)通常用于检索 JSON 数据或将 JSON 数据发布到服务器。此外,如果客户端脚本发出虚拟请求,服务器可能会向房间添加请求套接字或从房间中删除请求套接字。

请注意,使用“虚拟方法”最终将运行相同的控制器操作,但会设置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
  });
}
Run Code Online (Sandbox Code Playgroud)

对于低级socket.io, sails 提供了全局变量io(来自 sails.io.js ),它是SailsSocket. 它允许您发出类似 HTTP 的“虚拟请求”。更多信息请参见此处(尽管您似乎已经阅读了有关 SailsS​​ocket 的所有内容:)。您可以使用 访问底层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");
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!