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

如何捕获NestJS中@FilesInterceptor装饰器抛出的错误

解决方案

问题根因

@FilesInterceptor 底层依赖 multer 库处理 multipart 请求,当上传文件数量超过你设置的 maxCount 参数时,multer 会直接销毁请求 socket,不会走常规的 NestJS 异常抛出流程,这就是错误不属于 HttpException 实例、异常过滤器无法捕获、同时客户端报 socket hang up、服务端打印 Unexpected end of multipart data 的核心原因。

可行解决方法

方案1:自定义 FilesInterceptor 重写错误处理逻辑

继承 NestJS 原生的 FilesInterceptor,统一捕获 multer 抛出的错误,转换为可被正常识别的业务异常,原有配置不需要做任何修改:

import { FilesInterceptor as NestFilesInterceptor } from '@nestjs/platform-express';
import { BadRequestException } from '@nestjs/common';

export const CustomFilesInterceptor = (
  fieldName: string,
  maxCount: number,
  options?: any,
) => {
  const baseInterceptor = NestFilesInterceptor(fieldName, maxCount, options);
  return class extends baseInterceptor {
    async intercept(context, next) {
      try {
        return await super.intercept(context, next);
      } catch (err) {
        // 匹配文件数量超出限制的错误码
        if (err.code === 'LIMIT_FILE_COUNT') {
          throw new BadRequestException(`上传文件数量不能超过${maxCount}个`);
        }
        // 其他multer相关错误也可在此处统一处理
        throw err;
      }
    }
  };
};

控制器中替换原有装饰器即可:

@UseInterceptors(CustomFilesInterceptor('files', 3, { /* 你的原有配置项 */ }))

方案2:全局添加 multer 错误处理中间件

如果不想修改现有接口的装饰器写法,可以在项目启动时全局注册错误处理中间件,提前拦截 multer 抛出的错误:

// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  // 全局处理multer抛出的错误
  app.use((err, req, res, next) => {
    if (err.code === 'LIMIT_FILE_COUNT') {
      return res.status(400).json({
        statusCode: 400,
        message: '上传文件数量超出限制',
        error: 'Bad Request'
      });
    }
    next(err);
  });

  await app.listen(3000);
}
bootstrap();

注意事项

  • 两种方案都不需要修改你原有的 multer 配置项,maxCount 参数可以正常保留
  • 处理后超出文件数量的错误会正常返回给客户端,不会销毁 socket,也不会导致服务崩溃
  • 你可以根据业务需求自定义返回的错误码和错误提示内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:36:08