#websocket #socket.io #ws
#websocket #socket.io #ws
Вопрос:
Я использую Node.js ws
библиотека, для прослушивания событий в учетных записях пользователей на стороннем API. Для каждого пользователя я открываю websocket для прослушивания событий в учетной записи пользователя.
Оказывается, сторонний API не предоставляет a userID
для каждого события, поэтому, если у меня есть 10 подключений websocket к учетным записям пользователей, я не могу определить, с какой учетной записи пришло событие.
У меня есть доступ к уникальному userId
идентификатору перед запуском каждого из моих подключений.
Есть ли способ добавить или обернуть соединение websocket userId
идентификатором к каждому соединению, которое я создаю, чтобы при получении события я мог получить доступ к пользовательскому идентификатору и впоследствии узнать, из какой учетной записи пользователя пришло событие?
Приведенный ниже код представляет собой смесь реального кода и псевдокода (т.е. customSocket
)
const ws = new WebSocket('wss://thirdparty-api.com/accounts', {
port: 8080,
});
ws.send(
JSON.stringify({
action: 'authenticate',
data: {
oauth_token: access_token,
},
})
);
// wrap and attach data here (pseudocode at top-level)
customSocket.add({userId,
ws.send(
JSON.stringify({
action: 'listen',
data: {
streams: ['action_updates'],
},
})
)
})
// listen for wrapper data here, pseudocode at top level
customSocket.emit((customData) {
ws.on('message', function incoming(data) {
console.log('incoming -> data', data.toString());
})
console.log('emit -> customData', customData);
})
Глядя на socket.io
библиотеку, эта namespace
функция может решить эту проблему, но я не могу определить, правда это или нет. Ниже приведен пример в их документации:
// your application has multiple tenants so you want to dynamically create one namespace per tenant
const workspaces = io.of(/^/w $/);
workspaces.on('connection', socket => {
const workspace = socket.nsp;
workspace.emit('hello');
});
// this middleware will be assigned to each namespace
workspaces.use((socket, next) => {
// ensure the user has access to the workspace
next();
});
Ответ №1:
Я нашел решение этой проблемы, которое довольно простое. Сначала создайте функцию обработчика сообщений:
const eventHandler = (uid, msg) => {
console.log(`${uid} did ${msg}`);
};
Затем, когда вы создаете websocket для данного пользователя, оберните .on
событие обработчиком:
const createSocketForUser = (uid, eventHandler) => {
const socket = new WebSocket(/* ... */);
socket.onmessage = (msg) => {
eventHandler(uid, msg)
};
return socket;
}