node.js - 在 express js 和 socket.io 中使用路由,一般情况下可能使用 Node

标签 node.js express socket.io

我正在尝试在 socket.io 中编写一个多 channel 应用程序。您所在的 channel 应该由您所在的网址定义。如果我用永久值在 app.js 中加入部分,一切正常。一旦我更改它以便 route.page 的路由进行连接,我就会收到错误消息,即套接字在上下文中不可用。怎样才能动态加入 channel ?

/app.js

var io = socketio.listen(app);
require('./io')(io);

io.sockets.on('connection', function (socket) {  
  socket.on('debug', function (message) {
    socket.get('channel', function (err, name) {
      socket.in(name).broadcast.emit('debug', message);
    });
  });
});

/io.js

var socketio = function (io) { 
  if (!io) return socketio._io;  
  socketio._io = io;
} 

module.exports = socketio;

/routes/index.js

var io = require('../io')();
exports.page = function(req, res){
  var channel = req.params.id;
  res.render('page', { title: 'PAGE', channel: channel  });
  io.sockets.on('connection', function (socket) {
    socket.join(channel);
    socket.set('channel', channel );
  });
};

最佳答案

我发现执行多个 channel 的最简单方法是使用不同的 URL。

例如,我让客户执行以下操作:

io.connect('/game/1')
io.connect('/system')

在我的服务器上

io.of('/game/1').on('connect' function(socket) {...})
io.of('/system').on('connect' function(socket) {...})

看起来我在这里连接了两次,但是 socket.io 足够聪明,可以为这个连接使用一个 websocket(至少在使用方法中是这样说的)。

关于node.js - 在 express js 和 socket.io 中使用路由,一般情况下可能使用 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812505/

相关文章:

node.js - 我如何一起使用passportjs和reactjs?

node.js - 将身份验证快速应用为单独的微服务

javascript - 快速路由和中间件

javascript - 防止 Socket IO 在 Chrome、firefox 和 Safari 移动浏览器上的非事件或不集中浏览器页面上 ping 超时

javascript - 使用 express js 在套接字 io 上阻止跨源请求

node.js - Socket.IO + Node.js + SSL

javascript - 无法加载静态文件 express js

node.js - 通过 crontab 执行 NodeJS 会抛出错误

javascript - Electron/NW.js 应用程序可以在浏览器中提供服务吗?

node.js - Passport 每次请求反序列化调用两次