繁体   English   中英

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

[英]How to import 300Mb JSON file from Firebase Storage to Database using 'onFinalize' in Cloud Functions?

我正在尝试使用由五个 'onFinalize' 事件触发的云函数将五个 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._callNext (/srv/node_modules/grpc/src/client_interceptors.js:568:42) 在 InterceptingListener.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:618:8) 在回调 ( /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)
                })
        })
    })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM