如何将文件从多部分表单请求发送到另一个多部分表单请求

时间:2017-02-20 18:59:28

标签: node.js stream pipe multipartform-data busboy

我目前有一个网关服务器,它接收多部分表单请求,其中每个请求包含一个文件和一些字段(用户ID,文件名等)。在服务器进行一些验证和其他一些事情之后,我想将带有几个不同字段的原始文件发送到我的单独文件存储服务器。换句话说,我更改字段,保持文件相同,并将其发送到第二台服务器。

我目前大约80%的时间都在工作,但剩下的时间我在存储服务器上遇到错误, 错误:由于多部分数据意外结束,部件提前终止< / EM> 即可。 (发生在评论&#39; ERROR PRINTED HERE&#39;)。同样,这个错误有时只会发生。

网关服务器

const testing = require("../../../lib/weather");

文件存储服务器

const asyncBusboy = require( 'async-busboy' );
const request = reqwuire( 'request-promise' );

async function saveFile( context )
{
    //parses the multipart form request. 'files' is an array of Readable Streams
    const { files, fields } = await asyncBusboy( context.req ); //NEVER breaks here

    if ( files.length == 0 )
        return;

    let form_data =
    {
        directory: 'my/files/directory',
        filename: 'filename',
        readstream: files[0]
        //etc, etc, etc
    };

    let options =
    {
        method: 'POST',
        uri: file_storage_server_url + '/song',
        headers: { 'content-type': 'multipart/form-data' },
        formData: form_data
    };

    await request( options ); //send to storage server
}

AsyncBusboy

asyncBusboy在内部执行的操作是在/ tmp目录中创建临时文件,将传入文件的读取流传输到临时文件,为临时文件创建读取流,并将其推送到&# 39;文件&#39;上面的数组。但是,我有时会收到管道中提到的错误。

const asyncBusboy = require( 'async-busboy' );

async function saveFile( context )
{
    const { files, fields } = await asyncBusboy( context.req ); //BREAKS HERE

    //more stuff
}

我认为发生了什么

我认为存储服务器正在读取tmp文件的速度超过了写入文件以使其到达文件末尾并触发错误, 部分由于意外而提前终止多部分数据结束。

问题

总体方法我错了吗?

async-busboy的内部方式根本就是错误吗?

如何解决此错误?

0 个答案:

没有答案