Используйте перехватчик внутри другого перехватчика в nestjs

Я создаю перехватчик внутри, который хочу использовать FileInterceptor, но получаю сообщение об ошибке, ожидаемое после FileInterceptor

import { CallHandler, ExecutionContext, Injectable, NestInterceptor, UseInterceptors } from '@nestjs/common';
import { Observable } from 'rxjs';
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { extname } from 'path';

@Injectable()
export class UploaderInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {

    @UseInterceptors(FileInterceptor('file', {
      storage: diskStorage({
          destination: './uploads'
          , filename: (req, file, cb) => {
              // Generating a 32 random chars long string
              const randomName = Array(32).fill(null).map(() => (Math.round(Math.random() * 16)).toString(16)).join('')
              //Calling the callback passing the random name generated with the original extension name
              cb(null, `${randomName}${extname(file.originalname)}`)
          }
      })
  }));


    return next.handle();
  }
}

1 ответ

FileInterceptor это mixinэто означает, что это функция, возвращающая класс. Эта функция принимает конфигурацию для фактического использования перехватчиком. Что вы можете сделать вместо того, чтобы пытаться создать класс, который использует перехватчик под капотом или расширяет его, по сути, это создать псевдоним для конфигурации следующим образом:

export const UploadInterceptor = FileInterceptor('file', {
  storage: diskStorage({
      destination: './uploads'
      , filename: (req, file, cb) => {
          // Generating a 32 random chars long string
          const randomName = Array(32).fill(null).map(() => (Math.round(Math.random() * 16)).toString(16)).join('')
          //Calling the callback passing the random name generated with the original extension name
          cb(null, `${randomName}${extname(file.originalname)}`)
      }
  }
)

Теперь с этой экспортированной константой (которая на самом деле является классом) вы можете использовать перехватчик как таковой:

@Controller('upload')
export class UploadController {

  @UseInterceptors(UploadInterceptor)
  @Post()
  uploadFile() {
  // do logic;
  }
}

И у вас все должно получиться.

Другие вопросы по тегам