【问题标题】:INVALID_ARGUMENT: maximum 500 writes allowed per request - Firebase Cloud Function - FirestoreINVALID_ARGUMENT:每个请求最多允许 500 次写入 - Firebase Cloud Function - Firestore
【发布时间】:2020-05-07 19:34:18
【问题描述】:

我正在尝试在 Firebase Cloud Function 中运行以下代码。我要做的是遍历名为 savedData 的 Firestore 集合中的所有文档,解析每个文档中存储为字符串的 JSON,然后将解析后的数据存储到名为 stgPicks 的集合中的新文档中。 savedData 集合中的每个文档都应在 stgPicks 集合中创建 50-100 个新文档。

当我尝试运行该函数时,我收到以下错误代码。

谁能帮忙调试这段代码?我不确定我是否正确处理了批次。

Error: 3 INVALID_ARGUMENT: maximum 500 writes allowed per request
    at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:175:52)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:341:141)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:304:181)
    at Http2CallStream.outputStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:115:74)
    at Http2CallStream.maybeOutputStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:154:22)
    at Http2CallStream.endCall (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:140:18)
    at Http2CallStream.handleTrailers (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:265:14)
    at ClientHttp2Stream.emit (events.js:198:13)
    at ClientHttp2Stream.EventEmitter.emit (domain.js:466:23)
exports.parsePicksRecover = functions.https.onRequest((req, res) => {
  let savedDataRef = admin.firestore().collection('savedData')
  let allDrafts = savedDataRef
    .get()
    .then((snapshot) => {
      snapshot.forEach((doc) => {
        const docId = doc.id
        const getDoc = admin
          .firestore()
          .collection('savedData')
          .doc(`${docId}`)
          .get()
          .then((doc) => {
            if (!doc.exists) {
              console.log('No matching document.')
            } else {
              const response = doc.data().data_json.replace(`,]`, `]`).replace(`,}`, `}`)
              const data = JSON.parse(response)
              const draft = data.draft
              const draftId = draft.draftid
              const draftYear = docId.substring(0, 4)
              let paramsStatic = {
                draftid: draftId,
                datetime: draft.datetime,
                myteam: draft.myteam,
                user: draft.user,
                draftyear: draftYear
              }

              const batchArray = []
              const batch = admin.firestore().batch()
              batchArray.push(batch)
              let operationCounter = 0
              let batchIndex = 0

              draft.picks.forEach((data) => {
                let paramsVar = {
                  teamid: data.teamid,
                  teamshortname: data.teamshortname,
                  fullname: data.fullname,
                  position: data.position,
                  school: data.school,
                  round: data.round,
                  ovrpick: data.ovrpick,
                  rdpick: data.rdpick,
                  createDate: admin.firestore.FieldValue.serverTimestamp()
                }
                let params = { ...paramsStatic, ...paramsVar }

                let writeResult = admin
                  .firestore()
                  .collection('stgPicks')
                  .doc(`${draftYear}|${draftId}|${data.ovrpick}`)
                batchArray[batchIndex].set(writeResult, params)
                operationCounter++
                if (operationCounter === 499) {
                  batchArray.push(firestore.batch())
                  batchIndex++
                  operationCounter = 0
                }
              })

              batchArray.forEach(async (batch) => await batch.commit())
              return
            }
          })
          .catch((err) => {
            console.log('Error getting document', err)
          })
      })
    })
    .catch((err) => {
      console.log('Error getting documents', err)
    })
})

Firebase Error Log

【问题讨论】:

    标签: javascript firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    我在使用 PHP SDK 时确实遇到了同样的错误,在我的情况下,问题是在提交之后我需要创建一个 batch 的新实例,否则我认为它会尝试提交旧文档更改两次,这就是为什么您遇到每个请求允许的最大 500 次写入错误,例如:

    let batch = admin.firestore().batch();
    
    for (i = 1; i <= 10000; ++i) {
         // do something with the batch
    
    
         if (0 === i % 500) {
              batch.commit();
              batch = admin.firestore().batch();
         }
    }
    
    
    batch.commit();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      相关资源
      最近更新 更多