【问题标题】:Route socket.io messages to express routes路由 socket.io 消息以表达路由
【发布时间】:2015-12-10 04:19:12
【问题描述】:

我希望将socket.io 集成到一个快递应用中。

sails.js 有一个非常好的功能,也可以通过 socket.io 消息调用快速路由。

但是,Sails 在其他方面比我需要的要多一些。我正在寻找一种无需使用整个sails 框架即可将socket.io 请求转发到表达路线的方法。我想这是一个很常见的要求,所以我很惊讶我还没有找到一个 npm 模块来做这个,但是找了很长时间,我什么也没找到。 express.io 这样做但相反 - 它将 HTTP 请求路由到 socket.io 处理程序。

为了澄清,我想使用我现有的以通常方式构建的快递应用程序...

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

然后链接到 socket.io 以便可以在客户端上通过 HTTP 调用 GET / 或使用 socket.io 来执行快速路由 /

socket.emit('GET', '/', function(response) {
  // do something with the response
});

理想情况下,它还可以在 express 和 socket.io 之间共享会话/身份验证(我从 Stack Overflow 上的其他帖子中看到这是可能的)。

我可以自己编写代码,但我不敢相信没有现成的解决方案或 npm 模块已经这样做了!

【问题讨论】:

  • 我不明白你到底需要什么。 And then to link in socket.io so that the express route / can be executed on the client either with an HTTP call GET / or using socket.io with something like - 套接字和 HTTP 是完全不同的协议,它们没有任何共同点 - 你不能 GET 带有套接字的 http 页面..
  • 我无法想象为什么这会有用?!套接字必须用作不同的协议,您只需监听套接字连接 - socket.on('connect', function() { socket.on('message', doStuff); });

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


【解决方案1】:

如果我正确理解了这个问题,您希望能够通过套接字事件或 REST 端点访问相同的业务逻辑服务器端。如果您在服务器端有适当的关注点分离,这是完全可行的。例如:

假设您有一个从数据存储服务器端提取的对象数组:

DataAccess.js:

function DataAccessor(){}

DataAccessor.prototype.getObjects = function(){
  var myObjects = new Array();
  return myObjects;
}


app.js //Routing for the REST endpoint and socket handling

app.get('/objects', function(req, res){
  res.send(new DataAccessor().getObjects());
});

var io = require('socket.io').listen(server);
io.sockets.on('connection', function (newSocket){
     newSocket.on('objects',function(){
      socket.emit('objectsSent',new DataAccessor().getObjects());
    });
});

在上面的示例中,客户端可以通过对“/objects”的 GET 请求调用 REST 端点来检索 JSON 集合。通过 socket.emit 触发名为“objects”的客户端套接字事件也会导致服务器发送相同的集合作为响应消息。

作为示例客户端,这两个部分的行为类似:

REST:
$.get("/objects",function(objectCollection){console.log(objectCollection);});

Sockets:
socket.on('objectsSent',function(objectCollection){console.log(objectCollection);});
socket.emit('objects');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2021-01-10
    • 2016-06-26
    • 2010-09-12
    相关资源
    最近更新 更多