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

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

相关推荐
智算菩萨20 分钟前
实战:高级中文自然语言处理系统的Python设计与实现
前端·javascript·easyui
远山无期42 分钟前
解决Tailwind任意值滥用:规范化CSS开发体验
前端·css·eslint
用户54277848515401 小时前
Vue 3 中开发高阶组件(HOC)与 Renderless 组件
前端
幼儿园老大1 小时前
告别代码屎山!UniApp + Vue3 自动化规范:ESLint 9+ 扁平化配置全指南
javascript·vue.js
HIT_Weston1 小时前
67、【Ubuntu】【Hugo】搭建私人博客(一)
前端·ubuntu·hugo
阿里巴啦1 小时前
用React+Three.js 做 3D Web版搭建三维交互场景:模型的可视化摆放与轻量交互
前端·react·three.js·模型可视化·web三维·web三维交互场景
Liu.7741 小时前
vue3组件之间传输数据
前端·javascript·vue.js
|晴 天|1 小时前
前端闭包:从概念到实战,解锁JavaScript高级技能
开发语言·前端·javascript
开发者小天1 小时前
react的拖拽组件库dnd-kit
前端·react.js·前端框架
用户4445543654262 小时前
在Android开发中阅读源码的指导思路
前端