首页 > 解决方案 > 如何在 node.js 中触发 firebase http 功能?

问题描述

我正在尝试使用 javascript 在 Firebase Cloud 函数中触发另一个函数。但我总是得到一个错误 Can't set headers after they are sent.请看我下面的代码:........ ………………………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………………… ............

exports.productIndexShuffleOne = functions.https.onRequest(async (req, res) => {
    const interval = req.query.interval;
    console.log("interval: "+interval);

    const productRef = admin.firestore().collection("Products");
    const adminRef = admin.firestore().collection("Admin").doc("totalProd").get();
    const dateRef = admin.firestore().collection("Admin").doc("totalProd").collection("indexShuffle").doc("productShuffle").get();

    return dateRef.then(documentSnapshot => {
        const setDate = documentSnapshot.get('date').seconds;

        var nextDay = setDate;
        console.log("Date: "+nextDay);

        const x = setInterval(function() {
            clearInterval(x);
            return Promise.all([adminRef]).then(result => {
                const totalNum = result[0].data().totalNumber;

                console.log("totalNum: "+totalNum);

                var numberList = [];
                var index = 1;
                while(index <= totalNum){
                    numberList.push(index);
                    index++;
                }

                var cidx, ridx, tmp;
                cidx = numberList.length;
                while (cidx !== 0) {
                    ridx = Math.floor(Math.random() * cidx);
                    cidx--;
                    tmp = numberList[cidx];
                    numberList[cidx] = numberList[ridx];
                    numberList[ridx] = tmp;
                }
                console.log(numberList);

                var counter = 0;
                return productRef.get().then(snapshot => {
                    snapshot.forEach(doc => {
                    const prodID = doc.get('productID');
                    const index = doc.get('index');

                    var newIndex = numberList[counter];
                    counter++;
                    console.log("oldIndex: "+index);
                    console.log("newIndex: "+newIndex);

                    productRef.doc(prodID).update({
                        index: newIndex
                        }, {merge: true});
                    });

                    return res.redirect('https://us-central1-myfunction-123456.cloudfunctions.net/productIndexShuffleTwo?interval='+interval);
                })
                .catch(err => {
                    console.log('Error getting documents', err);
                });
            });
        }, interval);
        return res.status(203).send(interval);
    }).catch(function(err) {
        console.error(err);
    });
});

标签: javascriptnode.jsgoogle-cloud-platformgoogle-cloud-functions

解决方案


这是因为您发送了多个响应,而规则是您只允许发送一个响应。请尝试查看您的代码并对其进行优化,使其仅包含一个响应。

我可以看到您有多个回复,如下所示:

1 -> return res.redirect('https://us-central1-myfunction-123456.cloudfunctions.net/productIndexShuffleTwo?interval='+interval);

2 -> return res.status(203).send(interval);

推荐阅读