如何使用Cloud Functions中的“ onFinalize”从Firebase存储将300Mb JSON文件导入数据库?

时间:2019-05-11 19:21:10

标签: node.js json google-cloud-firestore google-cloud-functions firebase-storage

我试图使用由五个“ onFinalize”事件触发的云函数将FireJSON存储中的五个JSON文件相互导入后,将它们从Firebase存储导入数据库。他们每个人都有自己的收藏夹。

JSON文件: 通常它是5个文件(〜13Mb约有9000条记录,〜19Mb约21000个记录,〜23Mb约57000个记录,〜95Mb约73000个记录和〜435Mb约208000个记录),所有文件的总大小约为600Mb

我的代码可以很好地处理非常小的文件(我对示例1Kb文件进行了测试),但是当我尝试在Firebase控制台中上传至少13Mb时,出现下一个错误:

  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.onReceiveStatus(/srv/node_modules/grpc/src/client_interceptors.js:618:8)在InterceptingListener._callNext(/srv/node_modules/grpc/src/client_interceptors.js:568:42) 回调时(/srv/node_modules/grpc/src/client_interceptors.js:845:24)

,它仅将一个第一个对象添加到数据库。看起来函数变得递归了,但是我不明白为什么:(

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)
                })
        })
    })

1 个答案:

答案 0 :(得分:0)