【问题标题】:how to emit from a controller function with socket.io?如何使用 socket.io 从控制器函数发出?
【发布时间】:2021-01-08 01:34:41
【问题描述】:

我正在构建我的第一个 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;
  });
});

要从我的控制器文件发出,我需要 io 对象还是只需要套接字,以及如何与控制器文件共享它/它们?

非常感谢所有帮助!

【问题讨论】:

  • 我的控制器是什么意思?您是否尝试将 http get/post 请求链接到 Web 套接字?
  • 是的,用于相关通知:)
  • 具体来说,当另一个用户向他们发送私人消息时,我想向该用户发送通知
  • 抱歉应该是socketdisconnect事件
  • 那个 export/require 问题可能是一个循环依赖。您包括来自服务器的控制器,以及来自控制器的服务器。

标签: node.js sockets socket.io mern


【解决方案1】:

为您的用户设置一个外部文件跟踪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 实例发送到路由器/控制器。我通常在服务器设置中为此attach the io instance to the app

app.io = io

然后在路由器/控制器中,您可以从req 对象访问io 实例:

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 {} 实例,因此可以附加通用代码,而不是在整个控制器中乱扔垃圾。

【讨论】:

  • 感谢您的帮助!我会检查一切是否正常并通知您。
  • 没问题。我记得我用头撞过这个!
猜你喜欢
  • 2022-12-11
  • 2014-07-07
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2018-03-08
  • 2016-03-21
相关资源
最近更新 更多