Javascript Firebase云功能更新数据库需要5分钟以上

Javascript Firebase云功能更新数据库需要5分钟以上,javascript,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Firebase,Google Cloud Firestore,Google Cloud Functions,控制台显示该功能已在2-3秒内执行。但在数据库中更新大约需要5分钟。云函数花费如此长的时间传播更改是否正常?有没有办法把延迟缩短到几秒钟 下面是云函数的代码。我通过url访问触发它。我知道代码有味道,但这只是一个原型 const listID = req.query.id; const user = req.query.user; const code = req.query.code; const title = req.query.title; con

控制台显示该功能已在2-3秒内执行。但在数据库中更新大约需要5分钟。云函数花费如此长的时间传播更改是否正常?有没有办法把延迟缩短到几秒钟

下面是云函数的代码。我通过url访问触发它。我知道代码有味道,但这只是一个原型

    const listID = req.query.id;
    const user = req.query.user;
    const code = req.query.code;
    const title = req.query.title;
    const desc = req.query.desc;

    var docRef = admin.firestore().collection('users/' + user.toString() + '/wordLists/' + listID.toString() + '/words');
    var docRef2 = admin.firestore().doc("users/" + user.toString() + "/wordLists/" + listID.toString());
    var docRef3 = admin.firestore().doc("users/" + user.toString());    //new 

    var description, length, name, courseId;
    
    description = desc;
    name = title;
    console.log("Description: " + description + ", d: " + desc);

    docRef2.get().then(
        function(doc) {
            if (doc.exists) {
                length = doc.data().length;
                courseId = user.toString()+","+listID.toString()+"," + code.toString();
                admin.firestore().collection('courses').doc(courseId).set({
                    description: description,
                    id: courseId,
                    length: length,
                    name: name,
                    creator: user,
                    downloads: 0,
                    rating: 0,
                    published: true,
                });
                
            } else {
                console.log("FAILED users/" + user.toString() + "/wordLists/" + listID.toString());
            }
            return "Done";
    }).catch(function(error) {
        console.log("Error getting document:", error);
    });

    docRef.get().then(function(querySnapshot){
        querySnapshot.forEach(function(doc) {
        if (doc.exists) {
            var mid = doc.data().meaningID;
            var smi = doc.data().subMeaningIndex;
            var docId = mid.toString() + "," + smi.toString();

            
            admin.firestore().collection('courses/'+ courseId + '/words').doc(docId).set({
                examples: doc.data().examples,
                meaningID: mid,
                subMeaning: doc.data().subMeaning,
                subMeaningIndex: smi,
                word: doc.data().word,
            });
        } else {
            console.log('users/' + user.toString() + '/wordLists/' + listID.toString() + '/words');
        }
        //return "Done";
    });
    return "Done2";
    }).catch(function(error) {
        console.log("Error getting document:", error);
    });
    
    docRef3.get().then(
        function(doc) {
            if (doc.exists) {
                var l = doc.data().coursesCreated;
                l.push(courseId);
                docRef3.update({coursesCreated: l});
            } else {
                console.log("users/" + user.toString() + "/wordLists/" + listID.toString());
            }
            return "Done";
    }).catch(function(error) {
        console.log("Error getting document:", error);
    });
    
    res.send("Success");
这里是控制台输出。您可以看到4:26的console.log输出是在他们说函数执行完成之后出现的

在代码中,由于执行了基于承诺的非阻塞函数,res.send部分将立即被访问。正如Doug所写,您应该将其放入承诺回调中

您应该在.then块中发送res.send,或者在.catchblock中发送res.status500.send,并且只发送一次


如果您不想处理承诺级联,也可以在try/catch结构中使用async/await。

您没有正确处理承诺。然后打电话,并抓住每一个是不够的。您需要确保res.send仅在每个承诺解决后执行。仅仅把它放在底部是不够的——承诺必须被拴住。