【问题标题】:How to emit from Client Side to a routes file with Socket.io in Node.js如何在 Node.js 中使用 Socket.io 从客户端发送到路由文件
【发布时间】:2017-12-12 13:09:20
【问题描述】:

所以我使用单例模式来设置我的 websocket。

var sio = require('socket.io')
var io = null;

exports.io = function () {
  var socket; 
  if(io === null){ // Initialise if not already made 
    io = initialize(server);
  }
  return io;
};

exports.initialize = function(server) {

  io = sio.listen(server);
  var connections = [];

  console.log('IO Initialized!\n')

  io.on('connection', function(socket){
    connections.push(socket);
    console.log('Connected: %s sockets connected', connections.length);

    socket.on('disconnect', function(data){
      connections.splice(connections.indexOf(socket), 1);
      console.log('Disconnected: %s sockets connected', connections.length);
    });

    // Update function used to send messages to and from backend 
    socket.on('update', function(data){
      io.sockets.emit('new message', {msg: data});
    });


  });

};

然后在我的公共/javascript 文件中,我可以这样调用它们

$(function(){

    var socket = io.connect();
    socket.emit('update', 'Test Update');
    socket.on('update', function(data){
       console.log('here: ' + data);
    });
});

在我的路线文件中我有

router.use(function(req, res, next){
    if(socket === undefined){
        socket = io.io();
    }
    next();
});

router.get('/', function(req, res, next){


    socket.on('update', function(data){
        console.log('in routes');
    });

    socket.emit('update', 'leaving routes');
});

我可以成功地从路由文件发送到公共 js 文件(从后端到前端)。但是,我无法将公共 js 文件中的信息发送到路由文件,它只发送到单例模式 js 文件。我怎样才能让它发送到路由文件呢?如果我以错误的方式解决这个问题,有人可以提供一个如何在路由和公共 js 文件之间进行通信的示例吗?

【问题讨论】:

  • 您似乎误解了socket 是什么。它是每个传入客户端连接的唯一对象。这不是单例。您不能只将其称为全局。事实上,唯一可以真正使用它的地方是在io.on('connection', ....) 处理程序中,因为这是为您提供连接的每个新socket 对象的地方。如果您在路由中尝试做的是访问与当时正在发出请求的特定用户相对应的套接字对象,那么这是一个完全不同的问题,这里还有许多其他答案可以探索。
  • 我建议你在这里搜索“在 Express 路由中访问 socket.io 连接”,看看你会发现什么。连接两者的常用方法是通过会话对象,当 socket.io 连接连接时,您在会话中进行一些初始化,以便稍后在路由中,您可以查看会话以访问 socket.id 从中你可以得到socket对象。

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


【解决方案1】:

据我所知,您的单例设置没有任何问题。

然而,每一个你要监听事件的地方,你必须把它包裹在io.on('connection', ...)中。将其设为单例并不妨碍这是一项要求。

编辑:我可能在这里错了,我刚刚注意到exports.initialize 实际上并没有返回connections。试过了吗?

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 2019-02-05
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多