如何基于JSON文件实现与MongoDB版本功能相同的Nodejs API路由
基于JSON文件存储的会话列表路由实现
以下实现和你提供的MongoDB版本功能完全对齐:
const fs = require('fs/promises'); const path = require('path'); const mongoose = require('mongoose'); router.get("/conversations", async (req, res) => { try { // 获取当前请求用户ID,统一转字符串避免类型不匹配 const from = mongoose.Types.ObjectId(jwtUser.id).toString(); // 读取会话和用户的JSON存储文件,路径请按你项目实际结构调整 const [conversationsRaw, usersRaw] = await Promise.all([ fs.readFile(path.join(__dirname, './data/conversations.json'), 'utf-8'), fs.readFile(path.join(__dirname, './data/users.json'), 'utf-8') ]); const conversations = JSON.parse(conversationsRaw); const users = JSON.parse(usersRaw); // 对应MongoDB的match逻辑:筛选出当前用户参与的会话 const userRelatedConvs = conversations.filter(conv => conv.recipients.map(id => id.toString()).includes(from) ); // 对应MongoDB的lookup + project逻辑:关联用户信息并过滤敏感字段 const result = userRelatedConvs.map(conv => { const recipientObj = conv.recipients .map(recipientId => { const matchedUser = users.find(u => u._id.toString() === recipientId.toString()); if (!matchedUser) return null; // 过滤不需要返回的用户字段 const { password, __v, date, ...safeUserInfo } = matchedUser; return safeUserInfo; }) .filter(Boolean); return { ...conv, recipientObj }; }); res.setHeader("Content-Type", "application/json"); res.send(result); } catch (err) { console.log(err); res.setHeader("Content-Type", "application/json"); res.end(JSON.stringify({ message: "Failure" })); res.sendStatus(500); } });
注意事项
- 如果你的JSON文件中
_id本身就是字符串格式存储,可以去掉所有toString()转换逻辑,减少冗余操作 - 并发写入JSON文件的场景建议加读写锁,避免文件读写冲突导致数据损坏
- 数据量较大时可以对JSON内容做内存缓存,定时落地到磁盘,降低磁盘IO开销提升接口性能
内容的提问来源于stack exchange,提问作者Wani
相关产品推荐
相关产品推荐

