node.js - 如何使用 Cloud Functions 中的“onFinalize”将 300Mb JSON 文件从 Firebase 存储导入数据库?
问题描述
我正在尝试使用由五个“onFinalize”事件在彼此上传后触发的云函数将五个 JSON 文件从 firebase 存储导入数据库。他们每个人都有自己的收藏。
JSON文件:通常是5个文件(~13Mb~9000条记录;~19Mb~21000条记录;~23Mb~57000条记录;~95Mb~73000条记录;~435Mb~208000条记录)所有文件的总大小~600Mb
我的代码适用于非常小的文件(我在示例 1Kb 文件上进行了测试),但是当我尝试在 firebase 控制台中上传至少 13Mb 时,我遇到了下一个错误:
- 未处理的拒绝
- 错误:4 DEADLINE_EXCEEDED:Object.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:1204) 的 Object.exports.createStatusError (/srv/node_modules/grpc/src/common.js:91:15) 已超过最后期限: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)
})
})
})
解决方案
云函数仅允许 10 MB https://cloud.google.com/functions/quotas
推荐阅读
- apache-spark - 为什么我在通过 spark-submit 运行我的 spark 代码时得到以下日志
- ember.js - 是否可以将查询存储在变量中?
- html - 如何修复背景图像顶部的重复内容?
- oracle - 创建 pl/sql 过程的困难
- python - 为什么我不能在 Python 中打印 Tensor 对象的内容?
- angular - Amchart 图例 值和标记之间的边距不起作用
- .net - Azure AD Identity.Client 调用 AcquireTokenByUsernamePassword,得到 406 错误
- python - 试图绘制数据框中缺失的百分比
- r - Rmarkdown - 编织时如何查看警告
- node.js - 刮取数字的字符串