i具有以下(示例)数组:
pages = [ {
"name" : "Hello",
"id" : 123
},{
"name" : "There",
"id" : 987
},{
"name" : "Great",
"id" : 555
} ];
我想将本数组中的每个对象作为集合中的文档保存。因此,我有以下功能:
exports.testSaveFacebookPages = functions.https.onRequest((req, res) => {
cors(req, res, () => {
let userUid = req.body.uid
// pages array is available here...
const PagesRef = admin.firestore().collection(`/users/${userUid}/pages/`)
return pages.forEach(function(page, index){
PagesRef.doc(`p${index}`).update(page, { merge: true })
});
res.status(200).send('Pages saved successfull!');
}); // cors...
}); // exports...
执行功能时,将页面保存到firestore :)但似乎该功能在循环中执行。记录说:
Function execution started
Function execution took 60002 ms, finished with status: 'timeout'
我已经阅读了:云功能具有Firestore错误的"交易超过"and https://firebase.google.com/docs/functions/terminate-functions
但是我找不到任何foreach的云功能示例。任何帮助都很棒!
在发送响应之前,您要退出功能。如果您从未发送响应,则您的HTTPS功能会超时。
相反,您应该收集 all 从 all> all 的承诺将更新到数组中,然后等待所有这些都可以解决,然后再发送最终响应。这样的东西:
exports.testSaveFacebookPages = functions.https.onRequest((req, res) => {
cors(req, res, () => {
let userUid = req.body.uid
const PagesRef = admin.firestore().collection(`/users/${userUid}/pages/`)
const promises = []
pages.forEach(function(page, index){
const promise = PagesRef.doc(`p${index}`).update(page, { merge: true })
promises.push(promise)
})
Promise.all(promises)
.then(results => {
res.status(200).send('Pages saved successfull!')
})
.catch(error => {
res.status(500).send('error')
})
})
})