尝试从 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/