javascript - 如何在 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);
});
});
解决方案
这是因为您发送了多个响应,而规则是您只允许发送一个响应。请尝试查看您的代码并对其进行优化,使其仅包含一个响应。
我可以看到您有多个回复,如下所示:
1 -> return res.redirect('https://us-central1-myfunction-123456.cloudfunctions.net/productIndexShuffleTwo?interval='+interval);
2 -> return res.status(203).send(interval);
推荐阅读
- flutter - 容器设计结构——Flutter
- c - 如何获取命令行参数以从同一 c 程序文件中的另一个方法读取输出?
- unity3d - 为什么 Unity 在构建中包含编辑器目录
- html - 如何使用纯 CSS 在一个 div 中订购(两列)长文本?
- javascript - 无法使用 MySQL 在 node.js 中执行 Sql 查询
- powerbi - 日期PowerBI的累计发生次数?
- oracle - 如何解决这个关于 Oracle 触发器的练习
- javascript - Javascript 从此数组中追加对象并创建带有对象键值对的新数组
- javascript - 无法提交包含多个文件和输入的表单
- android - 我正在尝试为我的应用程序创建启动画面,但我收到 AAPT: error: not well-formed error