将大型 json 文件从 Firebase 存储传输到 Firestore

Posted

技术标签:

【中文标题】将大型 json 文件从 Firebase 存储传输到 Firestore【英文标题】:Transfer large json files to Firestore from Firebase Storage 【发布时间】:2018-06-28 06:06:37 【问题描述】:

我需要使用 Firebase 函数将大型 JSON 文件从 Firebase 存储流式传输到 Firestore 的帮助。

我想将几个大型换行 JSON 文件 (11 x 700MB) 传输到 Firestore。我正在尝试从 Firebase 存储加载它们、流式传输文件并将内容写入 Firestore 集合。

当我在一个非常小的 json 文件上进行测试时,我目前在(从存储中)读取文件时遇到错误。我获得了读写访问权限,并且可以看到正在创建的 Firestore 文档(但只是有时)。

我的 Firebase Functions 控制台出现此错误:

错误:/user_code/node_modules/firebase-admin/node_modules/grpc/src/client.js:554:15 已超过截止日期

这也来自于从存储中读取,因为我已针对正在触发的读取错误设置警报。

const functions = require('firebase-functions');


const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const es = require('event-stream')
const Parser = require('newline-json').Parser
const gcs = require('@google-cloud/storage')();
const path = require('path');

// [START function]
exports.generateData = functions.storage.object().onChange(event => 
  const object = event.data; // The Storage object.

  const fileBucket = object.bucket; // The Storage bucket that contains the file.
  const filePath = object.name; // File path in the bucket.
  const contentType = object.contentType; // File content type.
  const resourceState = object.resourceState; // The resourceState is 'exists' or 'not_exists' (for file/folder deletions).
  const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

  // Exit if this is triggered on a file that is not JSON.
  if (!contentType.endsWith('json')) 
    console.log('This is not a json file.');
    return;
  

  // Exit if this is a move or deletion event.
  if (resourceState === 'not_exists') 
    console.log('This is a deletion event.');
    return;
  

  // Exit if file exists but is not new and is only being triggered
  // because of a metadata change.
  if (resourceState === 'exists' && metageneration > 1) 
    console.log('This is a metadata change event.');
    return;
  

  // Download file from bucket.
  const bucket = gcs.bucket(fileBucket);

let buf = []

  const getStream = function () 
      let stream = bucket.file(filePath).createReadStream().on('error', () =>  console.log('Read Error')).on('end', () => console.log('Successful Read'))
      let parser = new Parser()
      return stream.pipe(parser)
  

  getStream()
   .pipe(es.mapSync(function (data) 
     buf.push(data)
     pump()
   ))
   .on('end', () => 
     console.log("Strem Finished")
     return true
   )
   .on('error', () => 
     console.log('Stream Error')
     return false
   )

   function pump() 
     let pos;

     while((pos = buf.length) >= 1) 
       processLine(buf.pop(0))
     
   

   function processLine(line) 
     admin.firestore().collection('test').add(line)
   

);

我正在返回Read Error - 所以读取操作必须终止。

我现在不知道该怎么做,但希望能得到任何帮助。

【问题讨论】:

【参考方案1】:

Cloud Functions 的最长执行时间为 540 秒,因此它可能不适合您的需求。考虑设置一个小型 GCE 实例来进行迁移。

【讨论】:

以上是关于将大型 json 文件从 Firebase 存储传输到 Firestore的主要内容,如果未能解决你的问题,请参考以下文章

如何使用firebase函数返回保存在firebase存储中的文件的json内容

将大型 JSON 文件存储到 Oracle 数据库中

如何将大型 JSON 数据从服务器存储到 SQLITE Android?

在本地将 Firebase 数据存储为 JSON

React-native:下载并解压大型语言文件。

无法通过XMLHttpRequest发送大型json数据--javascript