Не удается загрузить файл из облачного хранилища в облачное хранилище с функцией временного хранения для чтения и обработки импорта CSV - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь использовать функцию onCall для firebase, чтобы загрузить CSV-файл из облачного хранилища, поместить его во временное хранилище облачной функции, затем прочитать и загрузить в коллекцию firestore, которая называется test. К сожалению, я не могу заставить работать временную память функции загрузки в облако.

Я пытался следовать документации Google по адресу https://firebase.google.com/docs/storage/extend-with-functions и другим примерам "return bucket.file (filePath) .download ({destination: tempFilePath}), но безуспешно.

Вот мой код

//THIS IS THE FUNCTION FOR LOADING AN PROCESSING A INCOMING CSV FILE
exports.uploadCSV = functions.https.onCall((data,context)=> {

    //get the file name from the boday
    const fileOne = data.id + '.csv';
        console.log('fileOne', fileOne);

    //bring together the director and file name
    const fileName = 'uploads/' + fileOne;
        console.log('fileName', fileName);

    //setup the temporary path
    const tmpFilePath = path.join(os.tmpdir(), fileName);
        console.log('tmpFilePath', tmpFilePath);

    //assign the Firbase project id
    const projectId = 'xxxxxxxxx';
        console.log('projectId')

    //assign storage to the project
    const storage = new Storage({ projectId: projectId });
        console.log('new Storage')

    //setup the bucket configuration
    const bucket = admin.storage().bucket();
        console.log('bucket', bucket)

    //Reference Storage Bucket in firestore
    const bucketName = 'xxxxxxxxx.appspot.com';
        console.log('bucketName');

    //sets myFile to value of file downloaded into cloud function temporary storage.
    return storage.bucket(bucketName).file(fileName).download({destination: tmpFilePath})
        .then(() => {
            console.log('image downloaded to:', tmpFilePath)
                    //read stream and process
            fs.createReadStream('tmpFilePath')
                .pipe(csv())
                .on('data', (row) => {
                    console.log(row);
                    if(row) {
                        firestore.collection('test').add({
                            name: row.Name
                        });
                    } else {console.log('no data')
                    }
                })
                .on('end', () => {
                    console.log('CSV file successfully processed.');
                });

        })
        .then(() => {
                //removes temporary directory
                return fs.unlink(tmpFilePath);
        })
        .catch((err)=>{ console.log(err); });

});

Хотя сетевая консоль возвращает 200, это ошибка, которую я получаю в своих журналах firebase-функций.

{Ошибка: ENOENT: нет такого файла или каталога, откройте /tmp/uploads/somedata.csv ошибка: -2, код: «ENOENT», системный вызов: «открыто», путь: '/tmp/uploads/somedata.csv'}

1 Ответ

1 голос
/ 10 апреля 2019

Ваш путь загрузки включает в себя папку «uploads», но вы никогда не создаете этот каталог явно. Вместо этого попробуйте просто загрузить в os.tmpdir () без каких-либо промежуточных каталогов, чтобы создать:

// no "uploads" here
const fileName = fileOne;
    console.log('fileName', fileName);

const tmpFilePath = path.join(os.tmpdir(), fileName);
    console.log('tmpFilePath', tmpFilePath);
...