Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用socket.io从控制器函数发出?_Node.js_Sockets_Socket.io_Mern - Fatal编程技术网

Node.js 如何使用socket.io从控制器函数发出?

Node.js 如何使用socket.io从控制器函数发出?,node.js,sockets,socket.io,mern,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(

我正在构建我的第一个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对象还是只需要套接字,以及如何与控制器文件共享它/它们


非常感谢大家的帮助

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

服务器设置:

const { connectedUsers } = require('./connectedUsers')

io.on('connection', (socket) => {
  socket.on('messageToServer', (dataFromClient) => {
    connectedUsers[dataFromClient.username] = socket;
  });
});
下一个问题是将
io
实例获取到路由器/控制器。我通常会在服务器设置中进行此操作

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
的任何地方都会弹出该代码。这个简单的对象通常会变成一个单例
类ConnectedUsers{}
实例,这样就可以附加公共代码,而不是将其散落在整个控制器中。

您所说的来自我的控制器是什么意思?您正在尝试将http get/post请求链接到web套接字吗?是的,对于相关通知:)具体来说,我想在其他用户向用户发送私人消息时向用户发送通知。抱歉,这应该是
套接字
断开连接
事件导出/请求问题可能是一个循环依赖项。您包括来自服务器的控制器和来自控制器的服务器。感谢您的帮助!我会检查一切是否正常,然后告诉你。没问题。我记得我的头撞了这个!
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' })
  }
})