возвращение статуса, как только файл записан в локальную систему из корзины s3 - PullRequest
0 голосов
/ 27 ноября 2018

пытается извлечь файл из корзины 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})

}

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете вернуть new Promise вместо одного вместо того, которое вы получили, вызвав SDK's 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...