Как импортировать 300-мегабайтный файл JSON из хранилища Firebase в базу данных, используя onFinalize в облачных функциях? - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь импортировать пять файлов JSON из хранилища Firebase в базу данных, используя облачную функцию, запускаемую пятью событиями onFinalize после их загрузки друг за другом.Каждый из них имеет свою собственную коллекцию.

JSON-файлы: обычно это 5 файлов (~ 13 МБ с ~ 9000 записей, ~ 19 МБ с ~ 21000 записей, ~ 23 МБ с 57000 записей, ~ 95 МБ с 73000 записей и ~435 МБ с 208000 записей) с общим размером всех файлов ~ 600 МБ

Мой код работает нормально для очень маленьких файлов (я тестировал на примере файла 1 КБ), но когда я пытаюсь загрузить по крайней мере 13 МБ в консоль FirebaseЯ получаю следующую ошибку:

  1. Необработанный отказ
  2. Ошибка: 4 DEADLINE_EXCEEDED: Превышен крайний срок в Object.exports.createStatusError (/srv/node_modules/grpc/src/common.js: 91: 15) в Object.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:1204:28) в InterceptingListener._callNext (/srv/node_modules/grpc/src/client_inter68ors.js) :jInterceptingListener.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:618:8) при обратном вызове (/srv/node_modules/grpc/src/client_interceptors.js:845:24)1 * 101 * 101 * 101 * * * 101 *и это добавляет в базу данныхтолько один первый объект.Похоже, функция становится рекурсивной, но я не понимаю, почему: (
    const functions = require('firebase-functions')
    const { Storage } = require('@google-cloud/storage')
    const storage = new Storage()
    const admin = require('firebase-admin')
    admin.initializeApp(functions.config().firebase)
    const db = admin.firestore()
    const path = require('path')
    
    exports.logNewJSONFiles = functions
        .runWith({ timeoutSeconds: 120, memory: '2GB' })
        .storage.object()
        .onFinalize((file) => {
            return new Promise(function(resolve, reject){
                storage
                    .bucket(file.bucket)
                    .file(file.name)
                    .download()
                    .then(function(data){
                        if (data) return JSON.parse(data)
                    })
                    .then(function(data){
                        if (data) {
                            const destination = db.collection(path.basename(file.name))
                            for (var obj of data) destination.doc().set(obj)
                        }
                        return resolve()
                    })
                    .catch(function(e){
                        reject(e)
                    })
            })
        })
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...