从零开始用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.测试

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

相关推荐
憧憬成为web高手4 小时前
ACTF 12307复现
前端·bootstrap·html
wordbaby5 小时前
Axios 上传大文件崩溃:鸿蒙 RNOH 下 XHR 返回空响应头引发的"假失败"
前端·react native
wordbaby5 小时前
React Native 列表分页实战:下拉刷新与上拉加载的工程化方案
前端·react native
wordbaby6 小时前
脱离 Tab 栏的艺术:React Native 全屏子页面的导航架构实践
前端·react native·harmonyos
陈随易6 小时前
Redis 8.8发布,一定要更新
前端·后端·程序员
wordbaby7 小时前
React Native 新架构落地鸿蒙:跨三端政务级应用的工程实践与深度复盘
前端·react native·harmonyos
晓说前端7 小时前
第一篇:为什么学TypeScript?—— 优势、场景与环境搭建
javascript·ubuntu·typescript
excel8 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
ZC跨境爬虫8 小时前
模块化烹饪小程序开发日记 Day7:(菜谱详情接口开发与JSON数据读取全流程)
前端·javascript·css·ui·微信小程序·json
এ慕ོ冬℘゜8 小时前
JS 前端基础面试题
开发语言·前端·javascript