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

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

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

这是我的代码:

  1. 服务器端,一个名为“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');
    });
    
  2. 客户端,一个名为“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 检查我的答案

标签: node.js sockets express websocket socket.io


【解决方案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>
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2014-06-10
      • 2016-09-20
      • 2013-03-21
      • 2022-10-07
      • 2016-09-06
      相关资源
      最近更新 更多