如何摆脱"TypeError: req.pipe is not a function" nestjs 并加快速度



我尝试使用 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;
}

将文件上传到此操作后,代码会引发如下所示的异常

类型错误:req.pipe 不是一个函数 at multerMiddleware (D:\R.Khodabakhshi\Repository\raimun-webode_modules\multer\lib\make-middleware.js:176:9( at Promise (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs platform-express\multer\interceptors\file.interceptor.js:15:81( 在新承诺 (( at MixinInterceptor.intercept (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\platform-express\multer\interceptors\file.interceptor.js:15:19( at D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:22:36 at Object.handle (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:20:56( at LoggingInterceptor.intercept (D:\R.Khodabakhshi\Repository\raimun-web\dist\shared\logging.interceptor.js:28:21( at D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:22:36 at InterceptorsConsumer.intercept (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:24:24( at D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\router\router-execution-context.js:45:60 [嵌套] 10928 - 2020-02-06 10:10:49 [异常过滤器] 未定义 未定义 +587529ms 类型错误:req.pipe 不是一个函数 at multerMiddleware (D:\R.Khodabakhshi\Repository\raimun-webode_modules\multer\lib\make-middleware.js:176:9( at Promise (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs platform-express\multer\interceptors\file.interceptor.js:15:81( 在新承诺 (( at MixinInterceptor.intercept (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\platform-express\multer\interceptors\file.interceptor.js:15:19( at D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:22:36 at Object.handle (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:20:56( at LoggingInterceptor.intercept (D:\R.Khodabakhshi\Repository\raimun-web\dist\shared\logging.interceptor.js:28:21( at D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:22:36 at InterceptorsConsumer.intercept (D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\interceptors\interceptors-consumer.js:24:24( at D:\R.Khodabakhshi\Repository\raimun-webode_modules@nestjs\core\router\router-execution-context.js:45:60

如何解决问题???

不能将FastifyAdapterFileInterceptor一起使用。它在文档的开头是这样说的。如果你想使用Fastify和文件上传,你需要为它创建自己的拦截器。

问题解决了,正如杰伊·麦克丹尼尔(Jay McDaniel(提到的,我们不能将FastifyAdapterFileInterceptor一起使用。 我用这个小代码解决了这个问题。

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

我希望这也会对你有所帮助...

最新更新