【问题标题】:How to upload a file to S3 from the /tmp folder in AWS Lambda using Node.js如何使用 Node.js 从 AWS Lambda 中的 /tmp 文件夹将文件上传到 S3
【发布时间】:2021-03-18 15:17:23
【问题描述】:

我对@9​​87654321@ 不是很熟悉。所以我要做的是将S3 中的一个对象通过管道输出到/tmp 文件夹中,进行一些处理,然后将其放回另一个S3 存储桶中。

但是发生的事情是它会进入uploadToS3()函数,但不知何故它不会触发fs.readFile。所以在登录inside uploadToS3 function 后,它进入.then() 并记录'ends here'。

const s3 = new AWS.S3();
const fs = require('fs');


const pipeObject = async() => {
    var params = { Bucket: 'testbucket', Key: 'test.txt' };
    var file = fs.createWriteStream('/tmp/test.txt');
    await s3.getObject(params).createReadStream().pipe(file);

}

const uploadToS3 = async() => {
  console.log('inside uploadToS3 function');
  fs.readFile('/tmp/test.txt', function (err, data) {
    console.log('inside readFile');   //code does not reach here
    if (err) { 
      throw err; 
      
    }

    var base64data = new Buffer(data, 'binary');

    var s3 = new AWS.S3();
    var s3upload = s3.putObject({
      Bucket: 'testbucket2',
      Key: 'output-test.txt',
      Body: base64data
    },function (resp) {
      console.log('Done');
    });

  });
}


exports.handler = async (event) => {
var params = { Bucket: 'testbucket', Key: 'test.txt' };

var file = fs.createWriteStream('/tmp/test.txt');

try{
    await pipeObject().then(response => {
        if (fs.existsSync('/tmp/test.txt')) {
            console.log('test.txt file exists.');
            uploadToS3().then(response => {
              console.log('ends here');
            });
        }
    });

    
    
    
}catch(err){
    console.log(err);
}

};

【问题讨论】:

    标签: node.js amazon-web-services lambda


    【解决方案1】:

    您应该坚持使用await.then,而不是同时使用两者。

    由于您的处理程序已经是async,您不妨使用await

    您应该仔细阅读async functionPromise

    我已通过以下更改修改了您的代码:(未测试)。

    我已更改您的 uploadToS3 函数,使其返回 Promise

    我已更改您的处理函数,使其不再执行 await.then

    const s3 = new AWS.S3();
    const fs = require('fs');
    
    const pipeObject = async () => {
        var params = { Bucket: 'testbucket', Key: 'test.txt' };
        var file = fs.createWriteStream('/tmp/test.txt');
        await s3.getObject(params).createReadStream().pipe(file);
    }
    
    const uploadToS3 = async () => {
        return new Promise((resolve, reject) => {
            console.log('inside uploadToS3 function');
            fs.readFile('/tmp/test.txt', function (err, data) {
                console.log('inside readFile');   //code does not reach here
                if (err) {
                    reject(err);
                    return;
                }
    
                var base64data = new Buffer(data, 'binary');
    
                var s3 = new AWS.S3();
                var s3upload = s3.putObject({
                    Bucket: 'testbucket2',
                    Key: 'output-test.txt',
                    Body: base64data
                }, function (resp) {
                    console.log('Done');
                    resolve();
                });
            });
        });
    }
    
    
    exports.handler = async (event) => {
        var params = { Bucket: 'testbucket', Key: 'test.txt' };
    
        var file = fs.createWriteStream('/tmp/test.txt');
    
        try {
            await pipeObject();
    
            if (fs.existsSync('/tmp/test.txt')) {
                console.log('test.txt file exists.');
                await uploadToS3();
                console.log('ends here');
            }
        } catch (err) {
            console.log(err);
        }
    }
    

    【讨论】:

    • 输出文件似乎是空的,但这可能是一个单独的问题。这确实解决了我上面的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2022-11-03
    • 2020-06-22
    • 2019-03-30
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多