能否在socket.on方法内部调用mongoose model执行数据库操作?
问题解答
完全可以在socket.on的回调函数中调用Mongoose模型执行数据库操作,这是Socket实时通信场景结合持久化存储的常规实现方案,你当前的聊天场景下查询发送方账号信息的逻辑属于非常典型的用法。
你提供的现有代码存在一处语法错误需要修正:await关键字仅能在async标记的函数内使用,你当前的事件回调没有添加async声明,运行时会直接抛出语法错误,修正后的代码如下:
socket.on('sendMessage', async ({ senderId, receiverId, message }) => { const user = getUser(receiverId); const accountId = await accountModel.findById(senderId); if (user) { socket.to(user.socketId).emit('getMessage', { accountId, message, }); } });
以下是几个实操建议:
- 建议给数据库查询逻辑添加
try/catch异常捕获,避免数据库查询报错直接导致Socket服务进程崩溃 - 高并发场景下如果账号信息查询频率很高,可以考虑对高频访问的账号数据做缓存,降低数据库的查询压力
- 如果后续需要持久化存储聊天记录,也可以直接在该回调内调用对应消息模型的方法执行入库操作
内容的提问来源于stack exchange,提问作者rSeeker
相关产品推荐
相关产品推荐

