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

NestJs项目中如何将MongoDB数据导出为JSON文件下载到本地

NestJS 导出MongoDB数据为JSON文件实现方案

先修正现有代码笔误

原有代码中getUsers方法注入的是UserService实例,但实际调用的是shiftService.getMany(),属于笔误,需要先修正为this.userService.getMany()。

两种常见实现场景

场景1:将JSON文件保存到Nest服务运行的服务器本地

使用Node.js原生的fs/promises文件操作模块实现本地写入,完整代码如下:

import { Injectable } from '@nestjs/common';
import * as fs from 'fs/promises';
import * as path from 'path';
import { UserService } from './user.service';
import { User } from './schemas/user.schema';

@Injectable()
export class BackupService {
  constructor(private userService: UserService) {}

  private async getUsers(): Promise<User[]> {
    return await this.userService.getMany();
  }

  // 保存备份文件到服务器本地
  public async saveUserBackupToServer(): Promise<string> {
    const users = await this.getUsers();
    // 转换为格式化JSON字符串,提升可读性
    const jsonContent = JSON.stringify(users, null, 2);
    // 备份文件存储目录:项目根目录下的backup文件夹
    const backupDir = path.join(process.cwd(), 'backup');
    // 目录不存在则自动创建
    await fs.mkdir(backupDir, { recursive: true });
    // 带时间戳的文件名,避免覆盖旧备份
    const fileName = `users_backup_${Date.now()}.json`;
    const fullFilePath = path.join(backupDir, fileName);
    // 写入文件
    await fs.writeFile(fullFilePath, jsonContent, 'utf8');
    return fullFilePath;
  }
}

场景2:通过HTTP接口触发,直接下载到用户本地电脑

需要配合Controller设置响应头,触发浏览器/客户端的下载行为,代码如下:

BackupService 新增方法

// 在BackupService中新增导出方法
public async getUserBackupData(): Promise<{ content: string; fileName: string }> {
  const users = await this.getUsers();
  return {
    content: JSON.stringify(users, null, 2),
    fileName: `users_backup_${new Date().toISOString().slice(0, 10)}.json`
  }
}

BackupController 实现下载接口

import { Controller, Get, Res } from '@nestjs/common';
import { Response } from 'express';
import { BackupService } from './backup.service';

@Controller('backup')
export class BackupController {
  constructor(private readonly backupService: BackupService) {}

  @Get('users/download')
  async downloadUserBackup(@Res() res: Response) {
    const { content, fileName } = await this.backupService.getUserBackupData();
    // 设置响应头,触发客户端下载
    res.setHeader('Content-Type', 'application/json');
    res.setHeader('Content-Disposition', `attachment; filename=${fileName}`);
    res.send(content);
  }
}

配置完成后访问http://你的服务地址/backup/users/download即可直接下载JSON文件到本地。

注意事项

  • 单表数据量超过10万条时,不要一次性加载全量数据到内存,改用Mongoose游标流式查询+流式写入,避免内存溢出,核心逻辑示例:
const cursor = this.userService.model.find().cursor();
const writeStream = fs.createWriteStream(filePath);
for await (const doc of cursor) {
  writeStream.write(JSON.stringify(doc) + '\n');
}
writeStream.end();
  • 导出接口建议添加身份校验、权限判断逻辑,避免敏感数据泄露
  • 生产环境建议将备份文件上传到对象存储服务,避免服务器本地存储丢失风险

内容的提问来源于stack exchange,提问作者ffx292

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:42:02