如何在express的路由中操作socket.io

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在express的路由中操作socket.io相关的知识,希望对你有一定的参考价值。

参考技术A 最近,遇到一个问题需要在 express 路由中操作 socket ,而网上的例子基本上是在主文件操作 socket 。

给 router 添加一个 io 函数,接收参数 io ( io 是引入的 socket.io 库)。

咱把 router 导出,在 app.js 中导入,然后把 router.io 赋给 app.io 。

最后,在 bin/www 中导入 socket.io 并调用 app.io 。

现在 chat.js 中的 router.io 成功接收到导入的 socket 。

可能有人会有疑惑,怎么不直接在 chat.js 中直接导入 socket.io ?

用 express-generator 生成的 express 项目,目录结构如下

express项目目录结构

http 模块是在 bin/www 下导入并生成 server ,而 socket.io 基于 http (socket.io的参数就是server),所以网上的示例大多数是写在该文件里。

如果对你有帮助,请给个❤。

Socket.io express 不同的路由

【中文标题】Socket.io express 不同的路由【英文标题】:Socket.io express different routing 【发布时间】:2015-09-28 09:26:18 【问题描述】:

我正在尝试在最新的 express 版本上使用 Socket.IO,但没有成功。 我想在特定的 js 文件上使用 Socket.IO 功能,使用“路由器”而不是“app.js”,即全局文件。

另外,我希望服务器端与客户端不同。

这是我的代码:

    服务器端,一个名为“addPost.js”的文件,位于“routes”文件夹中:

    router.get('/', function(req, res, next) 
      io.on('connection', function (socket) 
        socket.emit('news',
            
                hello: 'world'
            );
    
        socket.on('my other event', function (data) 
            console.log(data);
        );
      );
      res.render('addPost');
    );
    

    客户端,一个名为“index.ejs”的文件位于“views”文件夹中,它与“addPost.js”无关:

    <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    <script>
      var socket = io.connect('http://localhost:3000/');
    
      socket.on('news', function (data) 
          console.log(data);
          socket.emit('my other event',  my: 'data' );
      );
    </script>
    

我怎样才能在它们之间建立联系??

【问题讨论】:

将 io.on('connection'... 放在 router.get.... 内没有意义。io.on(...) 只需要运行一次,你每次运行它有人到达您的路由的时间。您应该将套接字逻辑与路由器分开,因为它们不相关,尽管它们可能使用相同的数据。 @Molda,您能详细说明您的评论吗?具体来说,将套接字逻辑与路由器分开?我遇到了类似的问题,我不确定如何在 server.js 中设置连接后访问其他路由上的套接字。理想情况下,应该有一个 res.socket 对象来向客户端发出事件,但我还没有找到这样的功能。 @JonathanKempf 检查我的答案 【参考方案1】:

你需要让socket监听服务器的端口。在 addPost.js 中像这样:

   function listenServer()
io = require('socket.io').listen(server)

如果您不想在您的应用程序文件中执行此操作,您应该将链接发送到您的服务器到套接字。在你的 app.js 中有这样的东西:

    var server = http.createServer(app);
server.listen(app.get('port'), function()
    log.info('Express server listening on port ' + app.get('port'));
);
var socket = require('addPost.js');
socket.listenServer(server);

【讨论】:

【参考方案2】:

你不需要把 io.on 放在路由器里面 简单地做这个

router.get('/', function(req, res, next) 
  res.render('addPost');
  // after you render the page
  // client will connect to socket
  // or if you want to send news along with this request do something like
  getNews(function(err, news)          
      res.render('addPost', news: news);
      // obviously you need to render the news in your view
  );
);  



io.on('connection', function (socket) 
  // now after the client has recieved page from res.render
  // client will connect and can ask for news
  socket.on('getNews', function () 
      // your logic to get news
      getNews(function(err, news)          
          if(!err) socket.emit('news', news);
      );
  );

  socket.on('my other event', function (data) 
      console.log(data);
  );
);

在客户端脚本中

<script>
  var socket = io.connect('http://localhost:3000/');
  //ask for news
  socket.emit('getNews');

  socket.on('news', function (data) 
      console.log(data);
      socket.emit('my other event',  my: 'data' );
  );
</script>

希望对你有帮助。

【讨论】:

以上是关于如何在express的路由中操作socket.io的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io express 不同的路由

使用 Express JS 路由中的 Socket.io

Express Route & Socket io

text Express 4和Socket.io:将socket.io传递给路由。

Express、Socket.io 和 Nginx 的 CORS 问题

ExpressJS - 带有路由分离的 Socket.IO