node.js - 向房间发送消息的 SocketIO 无法正常工作
问题描述
我正在创建一个应用程序,允许用户与其他个人用户进行对话。作为应用程序中的用户,每当我与之交谈的人连接到应用程序时,我都希望收到一条消息,提醒我他在线。为此,我将 node.js 与 socketIO 一起使用并做出反应。
我在服务器中实现以下内容的方式是:
const socketio = require('socket.io');
const io = socketio(server);
io.on('connection', async (socket) => {
const { user } = socket.request;
const userConversationIds = user.conversations;
socket.join(conversationIds);
let ioToConversations = io;
userConversationIds.forEach((conversationId) => {
ioToConversations = ioToConversations.to(conversationId);
});
ioToConversations.emit('online', `${user.firstName} ${user.lastName} is now online!`);
});
在客户端:
import io from 'socket.io-client';
const socket = io();
componentDidMount () => {
socket.on('online', (messageText) => {
console.log(messageText); // eslint-disable-line
});
};
以上所有都导致了“用户现在在线”消息,仅发送给现在连接的用户本身。我希望对话中的其他用户有该消息,而连接的用户本身没有。
我在这里做错了什么?
解决方案
一个错误可能是您没有正确连接到服务器,<port>
假设您在本地运行,您需要使用此代码进行连接并替换为您的端口号:
io.connect("http://localhost:<port>")
另一个错误可能是您没有同时使用该.io()
方法.emit()
。我的意思是您.emit()
在 forEach 循环之后使用了该方法。您可以尝试这样做:
io.on("connection", async (socket) => {
const { user } = socket.request;
const userConversationIds = user.conversations;
let ioToConversations = io;
userConversationIds.forEach((conversationId) => {
ioToConversations = ioToConversations
.to(conversationId)
.emit("online", `${user.firstName} ${user.lastName} is now online!`);
});
});
另一个错误可能是因为您没有使用该.join()
方法使每个用户的套接字加入特定房间。您可以通过以下方式做到这一点:
userConversationIds.forEach((conversationId) => {
socket.join(conversationId);
});
这段代码应该放在forEach
发出消息的循环之前。您也可以同时加入和发射,但是我没有使用以下内容进行测试:
userConversationIds.forEach((conversationId) => {
socket.join(conversationId);
ioToConversations = ioToConversations
.to(conversationId)
.emit("online", `${user.firstName} ${user.lastName} is now online!`);
});
推荐阅读
- python - Python 测试速率限制处理程序
- oracle - 使用 REFERENCES 的 Oracle Sql 表和查询
- c++ - CS 3861 未找到标识符错误
- chart.js - Chartjs 未从 vuex 映射状态读取数据
- node.js - 带有 node.js 的在线编译器
- java - 将列表从 JSON 对象存储到 java arraylist
- jsf - 将 FontAwesome 5.15.0 与 PrimeFaces 8.0 一起使用
- javascript - 如何使用 axios / jest 测试失败的请求
- python - RuntimeError:发送“websocket.close”后出现意外的 ASGI 消息“websocket.send”
- apache-spark - 如何编写 pyspark map-reduce 来计算日期之前的事件数