Используйте Перехватчик внутри другого Перехватчика В nestjs - PullRequest
0 голосов
/ 08 апреля 2020

Я создаю перехватчик внутри, который я хочу использовать 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 Ответ

1 голос
/ 08 апреля 2020

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;
  }
}

И все должно сработать для вас.

...