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
相关产品推荐
相关产品推荐

