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

Nest.js项目重启(npm start)后图片文件夹被删除问题求助

Nest.js项目重启后图片文件夹被删除的解决方案

问题原因

  1. 源码目录存静态资源的风险:你把图片存在src/products/images(源码目录)里,Nest.js默认编译流程(比如nest build)只会处理TypeScript文件,不会把非源码文件复制到dist;部分watch工具或自定义启动脚本可能误清理src内的非源码文件。
  2. 相对路径解析问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:07:44