从 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 获取数据并写入文件后无法从文件中读取数据的主要内容,如果未能解决你的问题,请参考以下文章