node.js - 将socket.io与sails js一起使用

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

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

sails 网站 例如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 控制台中看到正在调用的站点,但没有任何反应。

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

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

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

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

最佳答案

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

请注意,使用“虚拟方法”最终会运行相同的 Controller 操作,但会设置 req.isSocket = true

此示例是一个 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),它是SailsS​​ocket的一个实例。它允许您发出 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");

希望这会有所帮助!

关于node.js - 将socket.io与sails js一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32751011/

相关文章:

node.js - Sequelize 中的求和查询?

node.js - Node JS Passport - 400 错误的注册请求

javascript - 具有动态字段名称的 Mongoose Model.update

node.js - 我应该使用什么? Socket.io 房间还是 Redis pub-sub?

websocket - wsengine.io和socket.io有什么关系

node.js - 虚拟机上的 NodeJS Protractor - 如何修复错误 199?

java - Jetty 中的 JSR-356 javax websockets(嵌入式和非嵌入式)

javascript - 为什么 chrome 开发者工具不显示 WhatsApp 网络应用程序请求?

node.js - Node : serving secure (wss://) and insecure (ws://) connections with the same server

push-notification - Webrtc 通过 FCM 发送通话报价