reactjs - 如何正确发送到插座房?
问题描述
“消息”套接字无法发送到前端。我认为问题源于我的服务器代码,特别是这个块:
socket.to(data.roomId).emit('message', {
from: data.from,
body: data.body,
timestamp: data.timestamp
});
当我将上面的内容更改为 时socket.emit('message')
,会在前端接收并呈现消息。但是,因为不是针对特定的 roomId,所以没有即时聊天功能。我知道 data.roomId 是在正确范围内使用 console.log 的正确 roomId。
服务器 API
io.sockets.on('connection', function (socket) {
//meant to join the socket to the roomId so that messages can be emmitted to the roomId
socket.on('join', function (data) {
socket.join(data.roomid, () => {
console.log(data.roomid);
});
});
//my Conversation schema holds Message Schemas
socket.on('connected', function (data) {
//loads all messages already created
const filter = { roomId: data.roomid };
(async () => {
console.log('searching for Schema');
let conversation = await Conversation.findOne(filter)
.populate('messages')
.exec(function (err, message) {
if (message) {
const array = message.messages;
console.log(array);
socket.emit('send', { arra: array }); //sends previous conversation
} else {
console.log('Schema not found');
}
});
})();
});
socket.on('server:message', (data) => {
const filter = { roomId: data.roomId };
const message = new Message({
from: data.from,
body: data.body,
timestamp: data.timestamp
});
(async () => {
console.log('searching for Schema');
let conversation = await Conversation.findOneAndUpdate(filter, {
$push: { messages: message }
});
if (conversation == null) {
console.log('Schema being created');
(await Conversation.create(filter)).populate('messages');
message.save(function (err) {
if (err) console.log('an error has occured saving the message');
// saved!
});
await Conversation.findOneAndUpdate(filter, {
$push: { messages: message }
});
let updatedConversation = await Conversation.findOne(filter);
} else {
console.log('Schema found');
let updatedConversation = await Conversation.findOne(filter);
message.save(function (err) {
if (err) return handleError(err);
// saved!
});
}
})();
//this socket is not working
socket.to(data.roomId).emit('message', {
from: data.from,
body: data.body,
timestamp: data.timestamp
});
});
});
前端
//this socket is not receiving anything
ioClient.on('message', (msg) => {
console.log(msg); //this is not printing anything
if (isMount) {
setMessages((previousMessages) => [
...previousMessages,
toChatMessage(msg)
]);
}
});
解决方案
当您从给定套接字使用广播到房间时
io.on('connection', function(socket){
socket.to('some room').emit('some event');
});
除了发送者之外,房间中的每个套接字都会收到该事件。
在您的情况下,您需要使用io.to('some room').emit('some event');
查看此Socket.IO 文档
推荐阅读
- usb - USB RAW (BULK) VISA Read/Write inside loop 太慢?
- ios - Swift Anchor 底部两个按钮,一个在左边,一个在右边
- c# - 使用与服务器 '.\SQLEXPRESS' 上的数据库 'ESCRestaurantDB' 的连接发生
- ruby - 在 ruby 中初始化随机数生成器(即设置种子)?
- javascript - JS Async/Await vs Promise vs Callbacks
- android - 如何在 Android 上的 onCreate() 和 onResume() 上设置条件?
- css - CSS过渡效果“滞后”
- python - 我在 python 中的刽子手游戏代码没有给出正确的输出
- javascript - 使用 nodejs/ffmpeg 合并输入流
- python - 用给定的输出替换列表中的素数索引