【发布时间】:2022-01-17 17:18:57
【问题描述】:
我在尝试获取数据的 Firebase 云功能时遇到问题。这个函数:
exports.fetchProducts= (req, res) => {
db.collection("products")
.where("active", "==", true)
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(async function (doc) {
let data = [];
// console.log(doc.id, " => ", doc.data());
const priceSnap = await doc.ref.collection("prices").get();
priceSnap.docs.forEach((snap) => {
data.push({ product: doc.data(), price: snap.data() });
// console.log(snap.id, " => ", snap.data());
});
return res.status(200).json(data);
});
})
.catch((err) => {
console.log(err);
res.status(500).json({ error: err.code });
});
};
返回此错误消息:UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client]。
返回数据(如果我刷新页面,仅返回所有数据)但带有上述错误消息。如果我删除这部分,它就会消失。
priceSnap.docs.forEach((snap) => {
data.push({ product: doc.data(), price: snap.data() });
// console.log(snap.id, " => ", snap.data());
});
更新
这将消除错误消息,但不返回任何数据。如果我将返回 res 链接到另一个 .then() 中也是一样的。我的理论是在获取数据之前返回响应。任何想法如何解决这个问题?
exports.fetchProducts = (req, res) => {
let data = [];
db.collection("products")
.where("active", "==", true)
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(async function (doc) {
// console.log(doc.id, " => ", doc.data());
const priceSnap = await doc.ref.collection("prices").get();
priceSnap.docs.forEach((snap) => {
data.push({ product: doc.data(), price: snap.data() });
// console.log(snap.id, " => ", snap.data());
});
});
return res.status(200).json(data);
})
.catch((err) => {
console.log(err);
res.status(500).json({ error: err.code });
});
};
##解决方案## 我确实找到了解决问题的方法。你可以在这个线程中找到它: How to achieve async behavior with nested firebase's forEach?
【问题讨论】:
标签: node.js firebase express google-cloud-functions