从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十二) socketio 消息处理

1.后端

在message.controller.js中 在sendMessage方法中 每当我们发送消息

需要socketio把这个消息转发给 接收人 加入转发逻辑

// 把消息发给指定的用户的socket

const receiverSocketId = getReceiverSocketId(receiverId);

if(receiverSocketId) {

io.to(receiverSocketId).emit("newMessage", newMessage);

}

2.前端

在useChatStore.js中 我们订阅newMessage这个事件 这样只有订阅了的才会收到消息

新增2个方法 订阅和 取消订阅

// 订阅其他用户传来的消息

subscribeToMessages:() => {

const {selectedUser} = get();

if(!selectedUser) return;

//获取userStore中的socket实例

const socket = useAuthStore.getState().socket;

socket.on('newMessage', (newMessage) => {

// 判断如果消息不是来自当前聊天对象,则不处理

if(newMessage.senderId !== selectedUser._id) return;

set({messages: ...get().messages, newMessage});

})

},

// 取消订阅

unsubscribeFromMessages:() => {

const socket = useAuthStore.getState().socket;

socket.off('newMessage');

},

在ChatBox.jsx组件中订阅消息

javascript 复制代码
const ChatBox = () => {
  const {messages, getMessages, isMessagesLoading, selectedUser, subscribeToMessages, unsubscribeFromMessages} = useChatStore()
  const {authUser} = useAuthStore()

  useEffect(()=>{
    getMessages(selectedUser._id)

    // 开始订阅消息
    subscribeToMessages()

    return () => unsubscribeFromMessages()
  },[selectedUser._id, getMessages,subscribeToMessages, unsubscribeFromMessages])

3.测试

完成了实时通信功能!下篇我们优化下前端页面

相关推荐
知了学历孙老师5 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu7 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说7 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
志尊宝9 小时前
AI原生前端开发(009):AI辅助性能分析与优化建议
人工智能·react.js·ai-native
程序员老赵9 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot9 小时前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot9 小时前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI10 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance10 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写10 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端