使用请求

时间:2017-08-13 15:19:58

标签: node.js post amazon-s3 request aws-sdk

使用Node.js,我正在尝试上传一个大文件(700MB~1GB),作为对POST请求(使用request)的响应,我的S3桶。

使用aws-sdk进行Javascript iv尝试了2种方法,但每种方法都有不同的问题:

方法 1 - 尝试在s3.upload()事件中调用response函数:

const sendRequest = (data) => {
    try {
        return new Promise((resolve, reject) => {
            AWS.config.loadFromPath('./config/awsConfig.json');
            let s3 = new AWS.S3({ params:{ Bucket:'myBucket', Key:'path/to/file.csv' } });

            request({
                method: 'POST',
                uri: 'https://www.example.com/apiEndpoint',
                headers: {
                    host: 'example.com',
                    'content-type': 'application/json'
                },
                body: JSON.stringify(data)
            }).on('response', (response) => { // 1st approach
                if (200 == response.statusCode) {
                    s3.upload({
                        Body: response,
                        ACL: 'public-read',
                        CacheControl: "5184000"
                    }, (err, data) => {  //2 months
                        console.log(err, data);
                    });
                }
            }).on('error', (error) => {
                reject();
            }).on('end', () => {
                resolve();
            });
        });
    } catch (error) {
        throw new Error('Unable to get and upload file');
    }
}

结果: s3.upload()被调用一次。该文件在存储桶中创建,但没有数据(零字节)。

方法 2 - 尝试在s3.upload()事件中调用data函数:

    const sendRequest = (data) => {
    try {
        return new Promise((resolve, reject) => {
            AWS.config.loadFromPath('./config/awsConfig.json');
            let s3 = new AWS.S3({ params:{ Bucket:'myBucket', Key:'path/to/file.csv' } });

            request({
                method: 'POST',
                uri: 'https://www.example.com/apiEndpoint',
                headers: {
                    host: 'example.com',
                    'content-type': 'application/json'
                },
                body: JSON.stringify(data)
            }).on('data', (data) => { // 2nd approach                    
                    s3.upload({
                        Body: data,
                        ACL: 'public-read',
                        CacheControl: "5184000"
                    }, (err, data) => {  //2 months
                        console.log(err, data);
                    });             
            }).on('error', (error) => {
                reject();
            }).on('end', () => {
                resolve();
            });
        });
    } catch (error) {
        throw new Error('Unable to get and upload file');
    }
}

结果:每次发生s3.upload()事件时都会调用 data。该文件在存储桶中创建,但每次发出事件时,新数据都会覆盖旧数据。最后,只有最后发出的数据(7kb~10kb)。  此外,在调用resolve()后,s3.upload()仍会被多次调用。

注意:

1)该函数返回Promise,因为我的整个过程是同步的。

2)这两种方法都取自Stream response from nodejs request to s3Piping from request.js to s3.upload results in a zero byte file

的答案

3)第三种方法是流式传输到我服务器上的本地文件,然后才上传到s3。我非常想避免这种情况。

关于如何让它发挥作用的任何想法?

0 个答案:

没有答案