Возникла проблема с чтением файла CSV внутри функций firebase - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь прочитать CSV-файл внутри функций Firebase, чтобы я мог отправить почту всем записям. Я планирую go с помощью следующей процедуры

  1. загрузить CSV
  2. запустить функцию финализации
  3. прочитать файл и отправить электронную почту

Ниже приведена функция

import * as functions from "firebase-functions";
import * as mkdirp from "mkdirp-promise";
import * as os from "os";
import * as path from "path";
import csv = require('csvtojson');

const gcs = require('@google-cloud/storage')({ keyFilename: 'service-account-credentials.json' });
const csvDirectory = "csv";
export = functions.storage.object().onFinalize(async (object) => {
    const filePath = object.name;
    const contentType = object.contentType;
    const fileDir = path.dirname(filePath);

    if(fileDir.startsWith(csvDirectory) && contentType.startsWith("text/csv")) {
        const bucket = gcs.bucket(object.bucket);
        const file = bucket.file(filePath);
        const fileName = path.basename(filePath);
        const tempLocalFile = path.join(os.tmpdir(), filePath);
        const tempLocalDir = path.dirname(tempLocalFile);
        console.log("values", bucket, file, fileName, tempLocalDir, tempLocalFile);
        console.log("csv file uploadedeeeed");
        await mkdirp(tempLocalDir);
        await bucket.file(filePath).download({
           destination: tempLocalFile
        });
        console.log('The file has been downloaded to', tempLocalFile);
        csv()
           .fromFile(tempLocalFile)
           .then((jsonObj) => {
              console.log(jsonObj);
           })
    }
});

Во время выполнения кода я загружаю только CSV-файл, который я написал в console.log, а затем через 1 минуту получаю тайм-аут. также не получает файл был загружен в журнал. Кто-нибудь может взглянуть на код и помочь мне выбраться из этого.

1 Ответ

0 голосов
/ 05 апреля 2020

Вы путаете использование async/await вместе с вызовом метода then(). Вы также должны использовать await для fromFile() метода .

Следующие действия должны выполнить (не проверено):

export = functions.storage.object().onFinalize(async (object) => {
    const filePath = object.name;
    const contentType = object.contentType;
    const fileDir = path.dirname(filePath);

    try {
            if (fileDir.startsWith(csvDirectory) && contentType.startsWith("text/csv")) {
                //.....
                await mkdirp(tempLocalDir);
                await bucket.file(filePath).download({
                    destination: tempLocalFile
                });
                console.log('The file has been downloaded to', tempLocalFile);

                const jsonObj = await csv().fromFile(tempLocalFile);
                console.log(jsonObj);
                return null;

             } else {
                //E.g. throw an error
             }


    } catch (error) {
        //.....
    } 

});

Также обратите внимание что (независимо от смешанного использования async/await и then()) со следующей строкой в ​​вашем коде

csv().fromFile(tempLocalFile).then(...)

вы не возвращали обещание, возвращенное методом fromFile(). Это ключевой момент в облачных функциях.

Я бы посоветовал вам посмотреть официальную серию видео об облачных функциях (https://firebase.google.com/docs/functions/video-series/) и, в частности, видео об обещаниях под названием "Learn JavaScript Promises".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...