错误:响应正文无效 - 在 firebase 函数中运行批量写入器时出错

问题描述 投票:0回答:1

几天来,当我将 .csv 文件上传到 firebase 存储中的文件夹时(其中 firebase 函数读取内容并将其保存到 firestore),我收到以下错误。

错误:尝试获取时响应正文无效https://firestore.googleapis.com/v1/projects/.../databases/(default)/documents:batchWrite?$alt=json%3Benum-encoding=int :读取经济重置

之后,我收到另一个错误,通知我函数崩溃了:“函数执行花费了 90053 毫秒,完成状态:‘崩溃’”。 随后出现多个如下错误:“已完成函数出现异常:错误:对 https://firestore.googleapis.com/v1/projects/... 的请求失败,原因:在安全 TLS 连接之前客户端网络套接字已断开连接”成立。

奇怪的是,几周前该功能还运行良好。我本可以最近更新 firebase SDK 和 Firebase-tools,但我不确定这是否是原因。 这是我的函数的代码:

// Create new documents from file on firebase storage
export const createDocumentsFromCSV = functions.region(functionLocation).runWith({
  timeoutSeconds: 540,
  memory: '8GB'
}).storage.bucket().object().onFinalize(async (object: any) => {
  // Check that the file is a CSV file and located in the specified folder
  if (!object.name.endsWith('.csv') || !object.name.startsWith('carga-documentos/')) {
    return null;
  }

  const bulkWriter = firestoredb.bulkWriter();
  let writeCount = 0;
  let batchCount = 0;

  const file = bucket.file(object.name);
  functions.logger.log(`Starting, fileName: ${object.name}`);
  const headers = ['id', 'client',.... 'creationTime', 'modificationTime'];

  // Read the CSV file from Firebase Storage
  const stream = file.createReadStream();
  return new Promise<void>((resolve, reject) => {
    stream.pipe(csv({ headers, skipLines: 1, separator: ';' }))
      .on('data', (row: any) => {
        try {
          row.client = JSON.parse(row.client);
          ...
          row.creationTime = Timestamp.fromDate(new Date(row.creationTime));
          row.modificationTime = Timestamp.fromDate(new Date(row.modificationTime));
          writeCount++;
          if (writeCount % 500 === 0) {
            batchCount++;
            functions.logger.log(`Batch ${batchCount} committed with ${writeCount} writes`);
          }
          const docRef = firestoredb.collection('clients').doc(row.client.id).collection('xxxxx').doc(row.xxxxx).collection('xxxxx').doc(row.id);
          bulkWriter.set(docRef, row);
        } catch (error) {
          functions.logger.log(`Row causing error: ${JSON.stringify(row)}`);
          functions.logger.log(`Error: ${error}`);
        }
      })
      .on('end', async () => {
        functions.logger.log(`Estimated number of batches: ${Math.ceil(writeCount / 500)}`);
        functions.logger.log(`Number of documents: ${writeCount}`);
        await bulkWriter.close();
        functions.logger.log(`Finished, fileName: ${object.name}`);
        resolve();
      })
      .on('error', (error: any) => {
        reject(error);
      });
  });
});

我尝试将 firebase SDK 更新到最新版本,并添加当前的 try-catch 块以获取有关错误的更多信息,但问题仍然存在,我没有主意。如果我不得不猜测,我会说我的 Bulk Writer 代码或节点版本(v16)可能有问题,但我不确定。

如果有人能看到我的代码中的任何错误或告诉我为什么会发生这种情况,我将不胜感激。我找不到与此类似的另一个问题(关于触发后台功能和 Firebase Bulk Writer) 谢谢!

澄清一下:

  1. 每个文件最多有 100.000 行,其中的信息保存为单独的文档。我想我可能可以上传 300.000 行,并且该函数应该仍然有足够的时间在超时之前将文档保存到 Firestore。
  2. 没有文档被多次保存,每个文档都有不同的ID。
  3. 文件按顺序上传,等待函数完成后再处理下一个文件。
firebase google-cloud-firestore google-cloud-functions bulkinsert
1个回答
0
投票

我会将我的解决方案留在这里,以防有人遇到同样的问题。将节点 16 更新到节点 18 解决了这个问题,这很奇怪,因为据称 Firebase Admin SDK 仅需要节点 14。(https://firebase.google.com/docs/admin/setup)。

© www.soinside.com 2019 - 2024. All rights reserved.