javascript - 文件从 s3 存储桶写入本地后返回状态

标签 javascript node.js amazon-s3

尝试从 s3 存储桶中获取文件并将其存储在本地,一旦写入本地,从本地读取文件并将数据转换为 json 格式并发送。

我需要检查文件是否下载并写入本地,一旦文件存在只读取并将其转换为 json 否则发送错误消息。

打开文件后,我将写入文件并结束。所以结束后我无法发送返回值。那么我该如何解决这个问题并使用 try catch 发送正确的错误消息。

const fetchFileDownloadAndWriteIt = () => {
 let Bucket = "DataBucket";
 let filename = "sample_data.csv";
 let s3 = new AWS.S3();
 const params = {
   Bucket: Bucket,
   Key: filename
 };

 return s3.getObject(params)
          .promise()
          .then(data => {
            const file = fs.createWriteStream('./localdata/' + filename);
            file.on("open", () => {
             file.write(data.Body);
             file.end();  
            })
            .on("error", err => {
               console.log("Error Occured while writing", err.message)
             })
          })
            .catch(err => {
             console.log("unable to fetch file from s3 Bucket", err.message)
          })


}


exports.fetchData = async (req,res) => {
  let fileDownloadAndWrite = await fetchFileAndDownloadWriteIt();
  // need to check file is downloaded and written properly
  const path = "./localdata/sample_data.csv";
  const json = await csv().fromFile(path);
  res.send({data: json})

}

最佳答案

您可以返回一个新的Promise,而不是您通过调用SDK 的 API 获得的那个。

return new Promise((res, rej) => {
    s3.getObject(params)
        .promise()
        .then(data => {
            const file = fs.createWriteStream('./localdata/' + filename);
            file
                .on("open", () => {
                    file.write(data.Body);
                    file.end();
                    //success
                    res();
                })
                .on("error", err => {
                    rej(err);
                })
        })
        .catch(err => {
            rej(err);
        })
});

这将解析为 undefined 并因发生适当的错误而被拒绝,例如在写入文件时等。

如何在您的处理程序中调用它?

像这样就好了。

exports.fetchData = async (req, res, next) => {
    try {
        await fetchFileDownloadAndWriteIt();
        // need to check file is downloaded and written properly - here the file is actually downloaded and written properly.
        const path = "./localdata/sample_data.csv";
        const json = await csv().fromFile(path);
        res.send({ data: json })
    }
    catch (err) {
        return next(err);
    }
}

关于javascript - 文件从 s3 存储桶写入本地后返回状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492067/

相关文章:

javascript - 包含来自其他 fiddle 的代码

javascript - 函数参数可以隐藏全局变量吗

node.js - 在真实的实时服务器中运行 socket.io 服务器,而不是本地主机?

node.js - Firebase 3.0 token : [Error: Invalid claim 'kid' in auth header.]

amazon-web-services - AWS 云信息 : How do I check if a bucket exists from within the Cloudformation template?

javascript - 仅在 Prop 更改时渲染子组件

JQuery Mobile data-rel ="back"无法在对话框中工作

amazon-s3 - s3 对象的 Glacier 检索通知

amazon-web-services - 亚马逊 s3 重命名 Key Name 误解

javascript - 使用 JavaScript 或 jQuery 读取数组 JSON