当前位置: 首页 > article >正文

从零开始用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组件中订阅消息

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.测试 

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


http://www.kler.cn/a/578413.html

相关文章:

  • Ansible安装
  • 2025-3-9 树和森林的遍历
  • 2025.3.9总结
  • laravel中 添加公共/通用 方法/函数
  • Go语言实战,HTTP和gRPC多服务启动与关闭的最佳实践
  • 免费送源码:Java+springboot+MySQL 房屋租赁系统小程序的设计与实现 计算机毕业设计原创定制
  • 部署说明书
  • 网络空间安全(19)CSRF攻防
  • 计算机视觉算法实战——老虎个体识别(主页有源码)
  • Python—类class复习
  • 【jstack查询线程信息】1.对比下arthas的thread 和jvm指令
  • 循环神经网络(RNN):时序建模的核心引擎与演进之路
  • 【C++】vector(下):vector类的模拟实现(含迭代器失效问题)
  • CEF 入门
  • 第6届传智杯复赛第一场
  • leetcode day27 455+376
  • EasyRTC嵌入式视频通话SDK的跨平台适配,构建web浏览器、Linux、ARM、安卓等终端的低延迟音视频通信
  • 20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能
  • 蓝桥杯 字符串拼接【省模拟赛】
  • 信息系统运行管理员教程9--大型网站运维