Nest.js项目重启(npm start)后图片文件夹被删除问题求助
Nest.js项目重启后图片文件夹被删除的解决方案
问题原因
- 源码目录存静态资源的风险:你把图片存在
src/products/images(源码目录)里,Nest.js默认编译流程(比如nest build)只会处理TypeScript文件,不会把非源码文件复制到dist;部分watch工具或自定义启动脚本可能误清理src内的非源码文件。 - 相对路径解析问题:Multer配置用了相对路径
./src/product/images,项目运行时工作目录变化可能导致路径解析错误,甚至意外删除目录。
解决步骤
1. 迁移图片存储目录到项目根目录
别把用户上传的图片放在源码目录src下,直接在项目根目录创建独立的静态资源文件夹:
mkdir -p uploads/product/images
2. 修改图片保存代码的路径
用绝对路径替代相对路径,确保路径解析稳定:
import { join } from 'path'; // 根据当前文件位置调整路径,确保指向项目根目录下的uploads const productImagesDir = join(__dirname, '../../uploads/product/images'); for (const image of images) { const fileName: string = uuid.v4(); const fileExtension: string = image.originalname.split(".").pop(); const filePath: string = `${productImagesDir}/${fileName}.${fileExtension}`; await fs.promises.copyFile(image.path, filePath); let productImage = this.productImageRepository.create({ product: product, url: `/api/product/images/${fileName}.${fileExtension}`, // 去掉硬编码localhost,用相对路径 }); await this.productImageRepository.save(productImage); successFullyUploadedImages.push(productImage); }
3. 修复MulterModule配置
同样用绝对路径配置Multer存储目录,避免路径出错:
import { MulterModule } from '@nestjs/platform-express'; import { diskStorage } from 'multer'; import { join } from 'path'; import { v4 } from 'uuid'; @Module({ imports: [ MulterModule.register({ storage: diskStorage({ // 调整路径指向项目根目录的uploads文件夹 destination: join(__dirname, '../../uploads/product/images'), filename: (req, file, cb) => { const uniqueSuffix: string = v4(); const extension = file.mimetype.split("/")[1]; cb(null, `${uniqueSuffix}.${extension}`); }, }), }), ], }) export class ProductModule {}
4. 配置静态资源服务
在AppModule中注册静态资源,让Nest.js能直接访问上传的图片:
import { ServeStaticModule } from '@nestjs/serve-static'; import { join } from 'path'; @Module({ imports: [ ServeStaticModule.forRoot({ rootPath: join(__dirname, '..', 'uploads'), // 指向项目根目录的uploads文件夹 serveRoot: '/api/product/images', // 对应图片URL的前缀 }), // 其他模块... ], }) export class AppModule {}
5. 检查启动脚本的清理逻辑
打开package.json,确认start脚本只清理dist目录,不会影响uploads:
{ "scripts": { "start": "rimraf dist && nest build && nest start", "start:dev": "nest start --watch" } }
如果有自定义清理命令,确保排除uploads目录。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

