为什么我通过Firebase Functions调用的Firestore交易超时了?

时间:2018-09-02 14:54:10

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

在功能日志中,我可以看到它正在运行,并且更新已应用于文档,但是它正在超时。

日志显示:

  

11:41:47.474 PM addContact函数执行耗时60003毫秒,已完成   状态:“超时”

     

11:40:47.743 PM addContact交易成功!

     

11:40:47.659 PM addContact 9 9

     

11:40:47.659 PM addContact

     

11:40:47.659 PM addContact 8 8

     

11:40:47.656 PM addContact

     

11:40:47.472 PM addContact函数开始执行

exports.addContact = functions.https.onRequest((req, res) => {

let user_id="fhr..."
let asker_id="wnz...";
let giver_id="Sp7...";

//const requestRef = admin.firestore().collection('contactRequests').doc(user_id)
const askerRef = admin.firestore().collection('users').doc(asker_id)
const giverRef = admin.firestore().collection('users').doc(giver_id)


var transaction = admin.firestore().runTransaction(t => {
  return t.getAll(giverRef, askerRef)
    .then(docs => {
      const id1 = docs[0];
      const id2 = docs[1];

      if ((id1.exists && id2.exists)) {
        // do stuff

        let giverContacts = docs[0].data().foo
        let askerContacts = docs[1].data().foo

        console.log("****")
        console.log(giverContacts, askerContacts)

        giverContacts=giverContacts+1
        askerContacts=askerContacts+1

        console.log("****")
        console.log(giverContacts, askerContacts)

        t.update(giverRef, {foo: giverContacts})
        t.update(askerRef, {foo: askerContacts})

        return true
      } else {
        throw new Error();
      }

    })
})
.then(result => console.log('Transaction success!') )
.catch(err => console.log('Transaction failure:', err) );

return transaction;

});

1 个答案:

答案 0 :(得分:1)

之所以超时,是因为您从未向客户端发送响应。 HTTP类型的函数仅在发送响应后终止。您什么都可以发送:

.then(result => {
    console.log('Transaction success!')
    res.send("OK")  // send anything at all to terminate the function
})

对于所有其他类型的功能,您必须在完成所有工作后返回承诺解决方案。

read the documentation以获取更多信息。