如何在NestJS中通过URL保存图片?现有代码问题求解
问题分析与修复方案
原代码存在几个核心问题:
- 函数未返回Promise,异步操作完成前就返回了文件名,调用方无法感知文件是否保存完成
filePath只指向static文件夹,未拼接文件名,导致流写入时目标是文件夹而非文件,触发错误try/catch无法捕获axios异步请求的错误,因为异步错误不会冒泡到同步的try块- 流操作的Promise未被正确返回,无法跟踪写入完成状态
修复后的代码
import { Injectable, HttpException, HttpStatus } from '@nestjs/common'; import axios from 'axios'; import * as fs from 'fs'; import * as path from 'path'; import { v4 as uuidv4 } from 'uuid'; @Injectable() export class FilesService { async createFileFromUrl(url: string): Promise<string> { try { const fileName = `${uuidv4()}.jpg`; // 拼接完整文件路径:文件夹 + 文件名 const fullFilePath = path.resolve(__dirname, '..', 'static', fileName); // 发起axios请求获取流 const response = await axios({ url, responseType: 'stream', }); // 将流写入文件,返回Promise等待写入完成 await new Promise<void>((resolve, reject) => { response.data .pipe(fs.createWriteStream(fullFilePath)) .on('finish', resolve) .on('error', (error) => { // 写入失败时删除已创建的空文件(可选) fs.unlink(fullFilePath, () => {}); reject(error); }); }); // 写入完成后返回文件名 return fileName; } catch (e) { throw new HttpException( 'Произошла ошибка при записи файла', HttpStatus.INTERNAL_SERVER_ERROR, ); } } }
关键修复点说明
- 改为
async函数并返回Promise<string>,让调用方可以通过await等待操作完成 - 修正
fullFilePath,拼接了生成的文件名,确保流写入到具体文件而非文件夹 - 使用
await处理axios请求,让异步错误能被try/catch捕获 - 等待流写入的Promise完成后再返回文件名,保证返回时文件已经保存成功
- 增加写入失败时删除空文件的逻辑(可选),避免生成无效文件
内容的提问来源于stack exchange,提问作者Vladon305
相关产品推荐
相关产品推荐

