【问题标题】:How to transfer data from a controller to a socket.io in nodejs?如何在nodejs中将数据从控制器传输到socket.io?
【发布时间】:2021-08-21 21:14:47
【问题描述】:

我正在构建一个 Web 应用程序,以使用 nodejs 作为后端从 api 接收数据,并使用 React 在客户端显示这些数据。但这是我第一次使用 socket.io。

Sockets.ts

function socket( io ){
    io.on("connection", socket => {
        var socketId = socket.id;
        var clientIp = socket.request.connection.remoteAddress;
        console.log('New connection ' + socketId + ' from ' + clientIp);
        
        socket.on("disconnect", () => {
          console.log("Client disconnected");
        });
      
      });
}

export default socket;

router.controller.ts

export const getData: RequestHandler = async (req, res) => {

  
  const options= {
    method: 'GET',
  };

  const response = await fetch(citybikeurl, options)
    .then((res: any) => res.json())  
    .catch((e: any) => {
      console.error({ error: e });
    });
  
  
  console.log("RESPONSE: ", response);
  res.json(response);
  
}

routes.ts

router.get('/', dataController.getData)

目前,我不知道我是否将任何数据从 controller.ts 传递到 Sockets.ts,然后能够发出结果。

【问题讨论】:

  • 将 express app 实例传递给套接字,然后将 socket.io 连接放入 app.set('io', io) 等然后在控制器中您可以执行 req.app.get('io').emit('etc'),或者在 socket() 函数之外初始化连接在您的代码中并仅返回连接,您甚至可以通过多种方式使用自定义 EventEmitter,我个人喜欢使用一个路由类并在该类中有一个 sockets(){} 方法,它在启动时将其注入事件,这样说用户的所有路由/套接字事件都在他们应该在的地方
  • 感谢您的回答。我完全按照您的解释进行尝试,但出现下一个错误: (node:27834) UnhandledPromiseRejectionWarning: TypeError: req.app.get(...).emit is not a function。实际代码在控制器中为req.app.get('io').emit(response),在app.ts中为app.set('io', io)

标签: node.js sockets socket.io


【解决方案1】:

您也应该在服务器端使用套接字。 请参阅本指南了解如何设置套接字服务器: https://medium.com/@raj_36650/integrate-socket-io-with-node-js-express-2292ca13d891

【讨论】:

  • 非常感谢您的回复。我发布的代码来自服务器端。我要检查你的建议。 PSDT。刚才我已经连接了客户端和服务器端,但它只向我发送套接字代码中的控制台消息。
猜你喜欢
  • 2021-07-03
  • 2017-09-16
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多