从 s3 获取数据并写入文件后无法从文件中读取数据

Posted

技术标签:

【中文标题】从 s3 获取数据并写入文件后无法从文件中读取数据【英文标题】:cannot read data from file after getting data from s3 and wrote to the file 【发布时间】:2019-08-11 07:47:56 【问题描述】:

我正在尝试从 s3 存储桶的文件中获取数据并写入临时文件,然后从该临时文件中读取数据。该文件已成功创建,临时文件中显示了一些 html 数据,但是当我尝试 console.log 下一步时,它返回空。

 try    
    ...
    const params = Bucket: "somebucket", Key: "file.html"
    let tempFile = fs.createWriteStream("./temp/file.html", 'utf8')
    s3.getObject(params).createReadStream().pipe(tempFile)

    fs.readFile('./temp/file.html', 'utf8', (err, data) => 
        if (err) console.log(err)
        else 
           console.log("cannot get data?") //this shows up
           console.log(data) // this one does not shows up
        
    )
    ...
 catch 
  ...

有人有这方面的经验吗?

更新:

我意识到数据在文件中,没有getObject()部分可以正常输出,但是数据不能显示出来。这可能是由于在数据完全插入文件之前读取了文件。我应该如何更改代码,以便在插入文件中的数据完成后延迟 readFile 执行。我试过 setTimeout 但失败了。

【问题讨论】:

How to get response from S3 getObject in Node.js? 不,数据在文件里面,所以getObject部分是成功的。也许我需要在 getObject 部分完成后延迟 readFile 的执行。 我尝试在不使用 pipe() 的情况下使用 getObject,它确实显示了数据,但它没有创建文件,因为 createReadStream 和 createWriteStream 已被删除。我想要的是先获取数据并保存到本地文件,然后使用该文件作为数据源进一步进行。 【参考方案1】:

这很可能是由 nodejs 的异步特性引起的问题。您的函数调用(s3.getObject 和 fs.readFile)彼此异步运行,因此 fs.readFile 在执行时没有可读取的内容。

您可以使用回调/承诺等待 s3.getObject,然后在回调/承诺完成后使用 fs.readFile(或者直接访问数据对象而不是将其写入文件,具体取决于您的用例,此选项可能更容易)

【讨论】:

但为什么 readFileSync() 不起作用?我之前尝试过 await s3.getObject 但没有运气。也许我没有做出承诺。 Seems like this is an issue with using createReadStream and then trying to readFile。我建议执行 s3.getObject 并在没有 createReadStream 的情况下处理数据,而是使用 writeFile 将返回的数据直接写入文件

以上是关于从 s3 获取数据并写入文件后无法从文件中读取数据的主要内容,如果未能解决你的问题,请参考以下文章

数据框无法在 S3 上写入

当我们从 s3 中的 csv 文件读取数据并在 aws athena 中创建表时如何跳过标题。

如何从 Job 内部将 csv 文件写入 S3?

从外部附件输入流中读取并推送到 s3 的最有效方法?

Python:如何从压缩的 json .gz 文件中读取并写入 json 文件

从 S3 读取大型 JSON 文件 (3K+) 并从数组中选择特定键