【问题标题】:Using socket.io with sails js将socket.io与sails js一起使用
【发布时间】:2015-12-21 10:42:44
【问题描述】:

感谢Irl Nathon's Sails Cast series,虽然曾经有非常好的关于使用套接字的文档。 v0.11 中的情况发生了变化,sails 团队封装并隐藏了 socket.io 例程。

帆网站 例如SailsSocket 简洁得令人发狂,只说要做什么,但不说如何做或在哪里做,或者我需要 npmbower 什么。尝试使用在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 控制台中看到正在调用的站点,但没有任何反应。

我相信这是因为我已经定义了自己的路由并在我的站点控制器中有自己的 find: 函数,并且我需要手动将某些内容推送到服务器端套接字中。但是我对如何在同一个控制器例程中使用 HTTP 调用整个页面以及使用 socket.io 的表感到困惑。

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

  • 我仍然在app.js 文件中执行此操作吗?

Sails Cast 显示它正在那里完成,但情况再次发生了变化。

【问题讨论】:

  • 可以this线程帮助你吗?我认为这个问题很相似......
  • 请提供更多信息,您是如何配置帆钩的

标签: node.js websocket socket.io sails.js


【解决方案1】:

Sails “虚拟请求”(他们称之为这些基于 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 提供了全局变量io(来自sails.io.js),它是SailsSocket 的一个实例。它允许您发出 HTTP 风格的“虚拟请求”。更多信息here(尽管您似乎已经阅读了有关 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");

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2017-08-23
    相关资源
    最近更新 更多