我意识到这里有一个重复: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'
答案 0 :(得分:0)
事实证明,第二段代码完美无缺。
该函数在部署后立即返回“连接错误”消息。如果我等到它部署后不再出现的5分钟。
我不确定这是否应该发生,但这个功能至少对我有用。
答案 1 :(得分:0)
我也遇到了连接错误和超时,这是我在部署后立即运行请求的时候。如果我等了2分钟左右它会运行正常。在运行它之前,似乎需要花一点时间来设置该功能。