Функция возврата из Asyn c после завершения загрузки и сохранения файла в NodeJS - PullRequest
1 голос
/ 16 апреля 2020

У меня есть последовательность событий, которая go примерно такая:

//Download a file and write it to disk
await downloadSyncFile(user, downloadURL)
//Use the file...
await useTheFile() //Crash! The file is only partially there! Dangit!

Мой код продолжает двигаться до того, как файл фактически окажется на диске. Вот моя функция загрузки:

async function downloadSyncFile(user, downloadURL){
  //Setup download path
  let path = './data/'+user+'/file.whatevs'

  try{
    //Download and save file
    let stream = fs.createWriteStream(path)
    let response = await axios.get(downloadURL, { responseType: 'stream' })
    response.data.pipe(stream)

    await new Promise(fulfill => stream.on('finish', fulfill))


  }catch(error){
    console.log('downloadSyncFile Error: '+error)
    return { success: false, message: error }
  }
}

Функция downloadSyncFile(), кажется, возвращается после завершения загрузки axios, но запись на диск не завершена.

Как я могу убедитесь, что файл безопасно записан на диск до того, как downloadSyncFile() вернет?

1 Ответ

1 голос
/ 16 апреля 2020

Вы не возвращаете обещание с downloadSyncFile().

Изменить

await new Promise(fulfill => stream.on('finish', fulfill));

на

return new Promise(fulfill => stream.on('finish', fulfill));

Было бы лучше написать так:

async function downloadSyncFile(user, downloadURL) {
    return new Promise((fulfill, reject) => {
        let path = './data/' + user + '/file.whatevs';
        let stream = fs.createWriteStream(path);
        let response = await axios.get(downloadURL, { responseType: 'stream' });
        response.data.pipe(stream);
        stream.on('finish', fulfill));
        stream.on('error', reject); // presumably
    });
}

С учетом всего, что заключено в new Promise(...), try{} catch() {} не требуется, поскольку любая синхронная ошибка приведет к отклонению Promise.

...