node.js - 如何从使用socket.io的 Controller 函数发出信号?

标签 node.js sockets socket.io mern

我正在构建我的第一个MERN应用程序[留言板],并尝试使用socket.io添加邮件通知。
到目前为止,我在server.js中:

const io = socketio(expressServer);
const connectedUsers = {};

io.on('connection', (socket) => {
  socket.emit('messageFromServer', { data: 'Welcome to the server' });
  socket.on('messageToServer', (dataFromClient) => {
    connectedUsers[dataFromClient.username] = socket;
  });
});
从 Controller 文件中发出信号,我需要io对象还是仅套接字,如何与 Controller 文件共享该对象?
所有帮助,不胜感激!

最佳答案

为用户跟踪connectedUsers.js设置一个外部文件,以避免circular dependencies

const connectedUsers = {}

module.exports = { connectedUsers }
服务器设置:
const { connectedUsers } = require('./connectedUsers')

io.on('connection', (socket) => {
  socket.on('messageToServer', (dataFromClient) => {
    connectedUsers[dataFromClient.username] = socket;
  });
});
下一个问题是将io实例发送到路由器/ Controller 。我通常在服务器设置中为此attach the io instance to the app
app.io = io
然后,在路由器/ Controller 中,您可以从io对象访问req实例:
const { connectedUsers } = require('./connectedUsers')

router.post('/message', function(req,res){
  if ( connectedUsers[req.body.username] && connectedUsers[req.body.username].id) {
     const id = connectedUsers[req.body.username].id
     req.app.io.to(id).emit({ msg: 'blah' })
  }
})
上面的if检查是将在您使用connectedUsers的任何地方弹出的代码示例。这个简单的对象经常变成一个单例class ConnectedUsers {}实例,因此可以附加通用代码,而不是在整个 Controller 中乱扔垃圾。

关于node.js - 如何从使用socket.io的 Controller 函数发出信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64001034/

相关文章:

javascript - 嵌套 .then() 的 Promise

javascript - 断开连接后 socket.io 没有重新连接

node.js - 如何从react.js发送数据到node?

node.js - 如何在 Amazon EC2 服务器上找到我的名称服务器?

c - 我是否创建一个临时 c 结构并通过套接字发送它?

c++ - 多线程客户端服务器

javascript - NodeJS + 套接字.io : simple Client/Server example not working

javascript - Socket.io 在处理模块时遇到一些问题

javascript - 事件发射器同步 node.js 客户端

python - 在 Socket Python 上发送图片