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