NestJS-文件上传到微服务

时间:2019-09-12 19:01:00

标签: node.js file-upload axios nestjs

我需要将文件上传到API网关。添加一些元信息之后,应将文件发送到另一个(微)服务(如Content-Type:multipart / form-data)。我在API网关中构建FormData对象时遇到一些问题。我不想将文件持久保存在网关上,因此我基本上只是试图将其传递出去。

为了创建formData对象,我使用Form-Data

这是尝试过的:

    // Controller
    @Post()
    @UseInterceptors(FileInterceptor('file'))
    async create(@Res() res, @UploadedFile('file') file, @Body() body: any) {
        return await this.someService.create(file);
    }
    // Service
    async create(file: any) {
        const formData = new FormData();

        formData.append('file', file);
        formData.append('key', 'value');

        const formHeaders = formData.getHeaders();

        try {
            const result = await this.httpService

                .post('http://some-other-service/import', formData , {
                    headers: {
                        ...formHeaders,
                    },
                })
                .toPromise();
            return result.data;
        } catch (e) {
            throw new BadGatewayException();
        }
    }

这会导致以下错误:

TypeError: source.on is not a function
at Function.DelayedStream.create (/usr/app/node_modules/delayed-stream/lib/delayed_stream.js:33:10)
at FormData.CombinedStream.append (/usr/app/node_modules/combined-stream/lib/combined_stream.js:44:37)
at FormData.append (/usr/app/node_modules/form-data/lib/form_data.js:74:3)
at ImportService.<anonymous> (/usr/app/src/import/import.service.ts:47:18)

1 个答案:

答案 0 :(得分:0)

这个问题有点老了,但是有人可能会从这个解决方案中受益。

问题是您要将整个@UploadedFile对象传递给formData.append方法。 @UploadedFile对象包含来自文件的数据,还包含MIME类型,大小,字段名(在这种情况下为“文件”),原始名(原始文件名)等。

您需要将要上传的文件的实际内容传递到formData.append方法。

要使其正常运行,请使用

formData.append('file', file.buffer);

//OR 
formData.append('file', file.buffer, file.originalname);