从Cloud Function

时间:2018-03-06 01:02:15

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

我意识到这里有一个重复:Execute more than 500 operations at once in Firestore Database,但是接受的答案在接受的答案中使用了TypeScript,这对我来说并不适用。

我从REST API中获取一些数据,这些数据返回一个约4000个对象的JSON数组。我想将所有这些对象保存到Firestore数据库的集合中。

所以,我试图运行一组多批次更新。

我有一些代码试图在for循环中将一些promises链接在一起,从外部源获取一些数据:

exports.getRawData = functions.https.onRequest((req, res) => {
  fetch('https://www.example.com', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: qs.stringify(body)
  })
  .then(response => response.json())
  .then(data =>
      fetch(`https://www.example.com/Endpoint?StartDate=${req.query.startDate}&EndDate=${req.query.endDate}`, {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${data.access_token}`
        }
      })
  )
  .then(response => response.json())
  .then(newData => {
    for (let i = 0, p = Promise.resolve(); i < 10; i++) {
        p = p.then(_ => new Promise(resolve =>
          {
                console.log(i);
                const batch = db.batch()
                let sliced = newData.slice(i * 40, (i+1) * 40)
                for (let j = 0; j < sliced.length; j++) {
                  let docRef = db.collection("SessionAttendance").doc()
                  batch.set(docRef, sliced[j])
                }
                batch.commit()
                resolve();
          }
        ));
    }
  })
  .then(() => {return res.send('OK')})
  .catch(err => console.log('Err: ' + err))
})

奇怪的是,这段代码并不总是给出相同的错误。有时会说:

Function execution took 3420 ms, finished with status: 'connection error'

我已经读过这个错误通常会发生,因为我有一些未回复的Promises,所以也许我有一些。

此外,在某些部署中,它会返回此错误:

Function execution took 60002 ms, finished with status: 'timeout'

然后它一直在反复运行。

我已经尝试了很多不同的方法来解决这个问题,但它们似乎都没有用。

我也试过这段代码:

.then(newData => {
    const batches = _.chunk(newData, 20)
            .map(postSnapshots => {
                const writeBatch = db.batch();

                postSnapshots.forEach(post => {
                    const docRef = db.collection("SessionAttendance").doc()
                // console.log('Writing ', post.id, ' in feed ', followerId);
                writeBatch.set(docRef, post);
                });

                return writeBatch.commit();
            });
            return Promise.all(batches);
  })

它给出了与上面相同的错误:

Function execution took 3635 ms, finished with status: 'connection error'

2 个答案:

答案 0 :(得分:0)

事实证明,第二段代码完美无缺。

该函数在部署后立即返回“连接错误”消息。如果我等到它部署后不再出现的5分钟。

我不确定这是否应该发生,但这个功能至少对我有用。

答案 1 :(得分:0)

我也遇到了连接错误和超时,这是我在部署后立即运行请求的时候。如果我等了2分钟左右它会运行正常。在运行它之前,似乎需要花一点时间来设置该功能。