#javascript #node.js #socket.io
#язык JavaScript #node.js #socket.io
Вопрос:
У меня есть приложение для стека MERN, и у меня есть массив, который отслеживает зарегистрированных пользователей.
server/index.js var connectedUsers = [] io.on('connection', (socket) =gt; { socket.on('addUser', (userId) =gt; { connectedUsers.push({userId, socket.id}) }) })
У меня также есть запрос на публикацию для создания почтового документа.
server/controllers/post export const createPost = async (req, res) =gt; { const post = req.body; const newPostMessage = new PostMessage({ ...post, creator: req.userId, createdAt: new Date().toISOString() }) try { await newPostMessage.save(); res.status(200).json(newPostMessage); awardBadges(req.userId) } catch (error) { res.status(50).json({ message: error.message }); } }
После создания почтового документа и отправки его в формате JSON он проверит, соответствует ли пользователь каким-либо требованиям к значку (аналогичному значку Stackoverflow).
export const awardBadges = async (userId) =gt; { // Assign awards // Update user's awards field with the badges he received // and mailbox field with that specifies which awards he received }
Если пользователь подключен и получил значок, он выдаст сообщение, чтобы пользователь отправил запрос GET в базу данных для получения поля своего почтового ящика.
Я знаю, что могу добиться этого, выполнив следующее:
io.to(socket.id).emit("getMailbox");
Но как я могу получить доступ к socketId, если он находится в другом node.js досье? Должен ли я сделать подключенных пользователей глобальным var?
Комментарии:
1. зависимость вводится
app
в код ввода-вывода сокета, затем устанавливаетсяio
вapp
.require('./socket.io')(server, app)
вserver/index.js
, затем вsocket.io.js
domodule.exports = async (server, app) =gt; { const io = require('socket.io')(server); const socket_clients = {}; app.set('socket_clients', socket_clients); app.set('io', io) ...
, затем из любого места вашего экспресс-кода , который у вас естьreq.app.get('io').to(...).emit('...')
, вы можете получить socketIdconst socket_clients = req.app.get('socket_clients'); const userSocket = socket_clients[userId]
, главноеapp.set
, что тогдаreq.app.get