You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:00:00