Node JS - Как дождаться появления файла в Google Cloud Storage Bucket, а затем загрузить файл - PullRequest
0 голосов
/ 02 февраля 2020

Моя команда и я пробовали множество методов для решения этой проблемы, но всякий раз, когда мы go загружаем файл, мы получаем сообщение о том, что файл не существует.

Каков типичный способ сделай это. Это похоже на то, что должно быть легко, но я не могу найти ничего, что работает.

Для пояснения, мой Node JS запускает функцию, которая загружает файл в одно ведро. Это запускает облачную функцию, которая выполняет некоторую обработку, а затем загружает файл в другое ведро. Я хочу, чтобы Node JS дождался загрузки этого другого файла, а затем загрузил файл.

const storage = new Storage();
const bucket = storage.bucket('receipttext');


async function uploadFile() {
    await storage.bucket("BUCKET_ONE").upload('FILE_PATH', {
        gzip: true,
        metadata: {
            cacheControl: 'public, max-age=31536000',
        },
    });
    console.log('step1!');
    const options = {
        destination: 'DOWNLOAD_PATH',
    };

    //Something needs to go here to cause Node JS to wait until the file exists
    let file = null;
    let ifExist = false;
    while(!ifExist) {
        console.log('step1.1!');
        file = await storage
            .bucket("BUCKET_TWO")
            .file('FILE_NAME');
        ifExist =  file.exists();
        //console.log('step1.2!',ifExist);
        console.log('step2!');
    }


    //Downloads the File
    await file.download(options).catch(function(error){
            console.log(2);
        });
    console.log(
        `gs:// downloaded .`
    );
    console.log('step3!');
    let obj = JSON.parse(fs.readFileSync('DOWNLOAD_PATH', 'utf8'));
    console.log(obj,"here");

    res.json({response: obj});
}
uploadFile().catch(console.error);
console.log("successUpload");

1 Ответ

0 голосов
/ 04 февраля 2020

Единственное, чего вам не хватает, - это ключевого слова await, так как exist () метод возвращает обещание (всегда истинное как логическое), которое преобразуется в массив, первым элементом которого является нужное вам логическое значение.

Итак, я бы настроил строку так:

ifExist =  await file.exists()[0];
...