Firebase Functions onCreate不会执行我的代码的一部分

时间:2019-08-23 22:30:55

标签: node.js firebase google-cloud-firestore google-cloud-functions

因此,我一直在编写一些代码以将Firestore与另一个程序的数据库同步,所以我添加了引用。

我希望我的onCreate方法从卖方条目中获取参考号,并使用该参考号创建一个新文档,以及在现有文档中更新orderReference字段(我希望数据库来处理它,而不是对客户/应用程序),请删除先前的订单,因为它的ID无法从函数中进行更新,并更新orderNumber字段。

我没有创建新文档,也没有更新值。我真的是Node.js和Promise的新手。欢迎任何提示和建议。

    exports.createOrderReference = functions.firestore.document('/orders/{order}').onCreate((snapshot, context) => {
    var id = snapshot.id; //id of order document
    var sellerID = snapshot.data().sellerID;

    var orderNumber = 0;
    var content;
    var sellerSnapID;
    return admin.firestore().collection('sellers').where("ID", "==", sellerID).get().then((qSnapshot) => {
        var docs = qSnapshot.docs;
        orderNumber = docs[0].data().orderReferenceNumber;
        sellerSnapID = docs[0].id;
        content = snapshot.data();
        Object.assign(content, {orderReference: orderNumber});
        console.log(content); // <----- last execution
        return content;
    }).then(() => {
        return admin.firestore().collection('orders').doc(orderNumber).set(content).then(() => {
            var promises = [];
            promises.push(admin.firestore().collection('orders').doc(id).delete());
            orderNumber++;
            promises.push(admin.firestore().collection('sellers').doc(sellerSnapID).update({orderReferenceNumber: orderNumber}));
            return Promise.all(promises);
        });
    }).catch((err) => {
        return err;
    });
  

更新的代码

exports.createOrderReference = functions.firestore.document('/orders/{order}').onCreate((snapshot, context) => {
    var id = snapshot.id; //id of order document
    var sellerID = snapshot.data().sellerID;

    var orderNumber = 0;
    var content;
    var sellerSnapID;
    return admin.firestore().collection('sellers').where("ID", "==", sellerID).get().then((qSnapshot) => {
        var docs = qSnapshot.docs;
        orderNumber = docs[0].data().orderReferenceNumber;
        var orderID = docs[0].data().orderReferenceNumber;
        sellerSnapID = docs[0].id;
        content = snapshot.data();
        content.orderReference = orderNumber;

        return admin.firestore().collection('orders').doc(orderID).set(content);
    }).then(() => {
        orderNumber++;
        var promises = [];
        promises.push(admin.firestore().collection('orders').doc(id).delete());
        promises.push(admin.firestore().collection('sellers').doc(sellerSnapID).update({orderReferenceNumber: orderNumber}));
        return Promise.all(promises);
    }).catch((err) => {
        return err;
    });
});

1 个答案:

答案 0 :(得分:1)

如果您要链接承诺,则需要在then()内返回承诺。

请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#Chaining,该解释说明:

  

如果该函数作为处理程序传递给,则返回一个Promise,则   等效的Promise将在   方法链。

当前,您第一次返回content,这不是一个承诺。您应该按照以下几行来修改代码:

exports.createOrderReference = functions.firestore.document('/orders/{order}').onCreate((snapshot, context) => {
var id = snapshot.id; //id of order document
var sellerID = snapshot.data().sellerID;

//....

return admin.firestore().collection('sellers').where("ID", "==", sellerID).get()
.then((qSnapshot) => {
    //.....
    //Set the value of content

    //Return a promise (from the set() method)     
    return admin.firestore().collection('orders').doc(orderNumber).set(content);
})
.then(() => {
    //.....

    //Return a promise, as you do with   
    return Promise.all(promises);

})
.then(results => {
    //.....
    //Return a promise
}).catch((err) => {
    console.log(err)
    return null;
});

您还可以在这里观看官方的Firebase视频系列:https://firebase.google.com/docs/functions/video-series/。尤其要观看三个名为“学习JavaScript的承诺”的视频(第2和第3部分特别关注后台触发的Cloud Functions,但之前确实值得观看第1部分)。