Как избавиться от «TypeError: req.pipe не является функцией» nest js и fastify - PullRequest
1 голос
/ 06 февраля 2020

Я попытался загрузить файл с помощью NestJS / Fastify и машинописного текста

это main.ts

async function bootstrap() {
  //file upload with fastify
  const fastifyAdapter = new FastifyAdapter();
  fastifyAdapter.register(fmp, {
    limits: {
      fieldNameSize: 100, // Max field name size in bytes
      fieldSize: 1000000, // Max field value size in bytes
      fields: 10, // Max number of non-file fields
      fileSize: 100, // For multipart forms, the max file size
      files: 1, // Max number of file fields
      headerPairs: 2000, // Max number of header key=>value pairs
    },
  });

  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    fastifyAdapter,
  );
 await app.listen(3000);
  Logger.log('application started on http://localhost:3000', 'Bootstrap');
}
bootstrap();

и это file.controller.ts

@Post()
  @UseInterceptors(FileInterceptor('image'))
  @ApiConsumes('multipart/form-data')
  @ApiBody({
    description: 'logo',
    type: UploadFileDto,
  })
  uploadedFile(@UploadedFile() file) {
    const response = {
      originalname: file.originalname,
      filename: file.filename,
    };
    return response;
  }

после загружая файл в это действие, код создает исключение, подобное этому

TypeError: req.pipe не является функцией в multerMiddleware (D: \ R.Khodabakhshi \ Repository \ raimun-web \ node_modules \ multer \ lib \ make-middleware. js: 176: 9) в Promise (D: \ R.Hhodabakhshi \ Repository \ raimun-web \ node_modules@nestjs \ platform-express \ multer \ interceptors \ file.interceptor. js : 15: 81) в новом Promise () в MixinInterceptor.intercept (D: \ R.Hhodabakhshi \ Repository \ raimun-web \ node_modules@nestjs \ platform-express \ multer \ interceptors \ file.interceptor. js: 15: 19) в D: \ R.Hhodabakhshi \ Repository \ raimun-web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js: 22: 36 в Object.handle (D: \ R.Hhodabakhshi \ Repository \ raimun -web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js: 20: 56) в LoggingInterceptor.intercept (D: \ R.Khodabakhshi \ Репозиторий \ raimun-web \ dist \ shared \ logging.i nterceptor. js: 28: 21) в D: \ R. Ходабахши \ Репозиторий \ raimun-web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js: 22: 36 в InterceptorsConsumer.intercept (D: \ R.Hhodabakhshi \ Репозиторий \ raimun-web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js: 24: 24) в D: \ R.Hhodabakhshi \ Репозиторий \ raimun-web \ node_modules@nestjs \ core \ router \ router-execute-context. js: 45: 60 [Nest] 10928 - 2020-02-06 10:10:49 [ExceptionFilter] undefined undefined + 587529ms TypeError: req.pipe не является функцией в multerMiddleware ( D: \ R.Khodabakhshi \ Репозиторий \ raimun-web \ node_modules \ multer \ lib \ make-middleware. js: 176: 9) в Promise (D: \ R.Hhodabakhshi \ Репозиторий \ raimun-web \ node_modules@nestjs \ platform-express \ multer \ interceptors \ file.interceptor. js: 15: 81) в новом Promise () в MixinInterceptor.intercept (D: \ R.Khodabakhshi \ Repository \ raimun-web \ node_modules@nestjs \ platform- экспресс \ multer \ interceptors \ file.interceptor. js: 15: 19) в D: \ R.Khodabakhshi \ Repository \ raimun-web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js: 22: 36 в Оби ect.handle (D: \ R.Hhodabakhshi \ Repository \ raimun-web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js: 20: 56) в LoggingInterceptor.intercept (D: \ R.Hodabakhshi \ Repository \ raimun-web \ dist \ shared \ logging.interceptor. js: 28: 21) в D: \ R.Khodabakhshi \ Repository \ raimun-web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js : 22: 36 в InterceptorsConsumer.intercept (D: \ Р.Ходабахши \ Репозиторий \ raimun-web \ node_modules@nestjs \ core \ interceptors \ interceptors-consumer. js: 24: 24) в D: \ Р.Ходабахши \ Репозиторий \ raimun-web \ node_modules@nestjs \ core \ router \ router-routing-context. js: 45: 60

как я могу решить проблему ???

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Проблема решена, поскольку Джей МакДэниел упомянул, что мы не можем использовать FastifyAdapter с FileInterceptor. Я решил проблему с этим небольшим кодом.

import {
  Controller,
  Logger,
  Post,
  Req,
  Res,
} from '@nestjs/common';
import * as fs from 'fs';
import * as path from 'path';
import * as pump from 'pump';
const logger = new Logger('FileController');

@ApiTags('File')
@Controller('api/file')
export class FileController {
  @Post()
  upload(@Req() req: any, @Res() reply: any): void {
      const mp = req.multipart(
      (field: any, file: any, filename: any, encoding: any, mimeType: any) => {
        console.log('save file from request ---- ', field, filename, mimeType);
        file.on('limit', () => logger.error('SIZE_LIMITED'));

        const filePath = path.resolve('./'+filename);
        const writeStream = fs.createWriteStream(filePath);
        pump(file, writeStream);
        writeStream.on('finish', () => {
          reply.code(200).send();
        });
      },

      (error: any) => {
        if (error) {
          logger.error(error);
          reply.code(500).send();
        }
      },
    );
    mp.on('partsLimit', () => logger.error('MAXIMUM_NUMBER_OF_FORM_PARTS'));
    mp.on('filesLimit', () => logger.error('MAXIMUM_NUMBER_OF_FILES'));
    mp.on('fieldsLimit', () => logger.error('MAXIMUM_NUMBER_OF_FIELD'));
  }
}

Надеюсь, это вам тоже поможет ...

0 голосов
/ 06 февраля 2020

Вы не можете использовать FastifyAdapter с FileInterceptor. Так сказано в начале документации . Если вы хотите использовать Fastify и загрузить файл, вам нужно создать для него собственный перехватчик.

...