尽管过去有关于套接字的非常好的文档,但是要感谢Irl Nathon's Sails Cast series。随着帆团队包装并掩盖了socket.io例程, v0.11 发生了改变。
帆位,例如SailsSocket简明扼要,说的是做什么,但没有说明如何做或在哪里做,或者我是否需要 npm 或 bower 。尝试使用Sails网站上讨论的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
我可以在Sails控制台中看到正在调用的站点,但是什么也没发现。
我相信这是因为我已经在站点 Controller 中定义了自己的路由并拥有了自己的find:函数,并且我需要手动将某些内容插入服务器端套接字。但是我对于如何在同一个 Controller 例程中使用HTTP调用整个页面以及仅使用socket.io调用表感到困惑。
app.js
文件中这样做吗? Sails Cast展示了该操作已在此处完成,但情况再次发生了变化。
最佳答案
Sails“虚拟请求”(它们称为这些基于socket.io的HTTP-ish请求)通常用于检索JSON数据或将JSON数据发布到服务器。另外,如果客户端脚本发出虚拟请求,则服务器可以向房间添加请求套接字或从房间移除请求套接字。
请注意,使用“虚拟方法”最终将运行相同的 Controller 操作,但将设置req.isSocket = true
。
此示例是一个 View ,该 View 为HTML需求请求呈现 View ,但为基于套接字的请求返回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提供了全局变量io
(来自sails.io.js),它是SailsSocket
的实例。它允许您发出HTTP式的“虚拟请求”。更多信息here(尽管您似乎已经阅读了有关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");
希望这可以帮助!
关于node.js - 在Sails JS中使用socket.io,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32751011/