Node.js Socket.io表示不同的路由

Node.js Socket.io表示不同的路由,node.js,sockets,express,websocket,socket.io,Node.js,Sockets,Express,Websocket,Socket.io,我正在尝试在最新的express版本上使用Socket.IO,但没有成功。 我想在特定的js文件上使用Socket.IO功能与“router”一起使用,而不是与“app.js”一起使用,后者是全局的 此外,我希望服务器端与客户端的页面不同 这是我的密码: 服务器端,一个名为“addPost.js”的文件,位于“routes”文件夹中: 客户端,一个名为“index.ejs”的文件,位于“views”文件夹中,它与“addPost.js”不相关: var socket=io.connect('

我正在尝试在最新的express版本上使用Socket.IO,但没有成功。 我想在特定的js文件上使用Socket.IO功能与“router”一起使用,而不是与“app.js”一起使用,后者是全局的

此外,我希望服务器端与客户端的页面不同

这是我的密码:

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

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

    
    var socket=io.connect('http://localhost:3000/');
    socket.on('news',函数(数据){
    控制台日志(数据);
    emit('my other event',{my:'data'});
    });
    

  • 如何在它们之间连接???

    您需要使套接字侦听服务器端口。在addPost.js中类似的smth:

    <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>
    
       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);
    

    您需要使套接字侦听服务器的端口。在addPost.js中类似的smth:

    <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>
    
       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);
    

    您不需要在路由器内部安装io 就这么做吧

    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>
    
    
    var socket=io.connect('http://localhost:3000/');
    //询问消息
    emit('getNews');
    socket.on('news',函数(数据){
    控制台日志(数据);
    emit('my other event',{my:'data'});
    });
    

    希望有帮助。

    您不需要在路由器内部安装io 就这么做吧

    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>
    
    
    var socket=io.connect('http://localhost:3000/');
    //询问消息
    emit('getNews');
    socket.on('news',函数(数据){
    控制台日志(数据);
    emit('my other event',{my:'data'});
    });
    

    希望能有所帮助。

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