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

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

相关推荐
萌萌哒草头将军7 分钟前
⚡️⚡️⚡️ 开源了!原来 Vite 加载图片还可以这样啊!🚀🚀🚀
javascript·vue.js·react.js
断竿散人7 分钟前
📏CSS尺寸单位终极手册:从px到fr的完全征服指南
前端·css·响应式设计
Rrvive10 分钟前
Python学习笔记
前端
Aisanyi11 分钟前
【鸿蒙开发】适配深浅色模式
前端·harmonyos
onejason11 分钟前
如何利用 PHP 爬虫按关键字搜索 Amazon 商品
前端·后端·php
IT 前端 张11 分钟前
搭建Node.js服务器
运维·服务器·node.js
咚咚咚ddd11 分钟前
前端基建:使用plus api实现app通知权限管理
前端·javascript·前端工程化
懒猫爱上鱼13 分钟前
Kotlin协程简单介绍
前端
傻梦兽13 分钟前
告别玄学!JavaScript的随机数终于能“听话”了!🎲
前端·javascript·typescript
聆川14 分钟前
UpgradeLens - 前端项目依赖版本兼容性检测工具
前端·node.js