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