与风帆js使用socket.io

虽然以前有很好的使用sockets的文档,感谢Irl Nathon的Sails Cast系列 。 在v0.11中 ,事情发生了变化 ,风帆团队正在封装和掩盖 socket.io例程。

风帆网站, 例如SailsS​​ocket是疯狂的简洁,说什么做,但不是如何或在哪里做,或者如果我需要npm凉亭的东西。 尝试使用在sails.config.sockets站点上讨论的sails.config.sockets特别令人沮丧。 我甚至无法在我的v0.11目录中find它。

首先,我想知道如何以及在哪里创build我自己的响应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 

我可以在sails控制台中看到正在调用的网站,但没有发现任何问题。

我相信这是因为我已经定义了我自己的路线,并在我的站点控制器中有我自己的find()函数,我手动需要将某些内容推送到服务器端套接字中。 但我很困惑,我怎么在同一个控制器例程中用HTTP调用整个页面,而用socket.io调用表格。

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

  • 我仍然在app.js文件中做?

风帆铸造表明它在那里完成,但事情已经改变了。

       

网上收集的解决方案 "与风帆js使用socket.io"

启动“虚拟请求”(他们称之为基于socket.io的HTTP-ish请求)通常用于检索或发布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 }); } 

至于低级别的socket.io ,sails提供了SailsS​​ocket实例的全局variablesio (来自sails.io.js)。 它允许你做HTTP-ISH“虚拟请求”。 更多的信息在这里 (尽pipe看起来你已经阅读了所有有关SailsS​​ocket的阅读:)。 您可以使用io.socket._raw访问底层的socket.io客户端。

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

希望这可以帮助!