onCall Http时Firebase函数异常
Firebase function exception when onCall Http
com.google.firebase.functions.FirebaseFunctionsException: 响应无效 JSON 对象。
exports.loadVideos = functions
.region('asia-south1')
.https.onRequest(async (req, res) => {
let uid = []
const subscribers = await db
.collection(SUBSCRIPTIONS_COLLECTION)
.doc('05piDSvu5mNxHOn2yKpnL2V322r1')
.get()
subscribers.data().subsBy.forEach((s) => {
uid.push(s.userId)
})
return db
.collection('videos')
.where('userId', 'not-in', uid)
.get()
.then((snapshot) => {
if (snapshot.empty) {
return res.status(404).send({
error: 'Unable to find the document',
})
}
let items = []
snapshot.docs.forEach((doc) => {
items.push(doc.data())
})
return res.status(200).send(items)
})
.catch((err) => {
console.error(err)
return res.status(404).send({
error: 'Unable to retrieve the document',
err,
})
})
})
无法找出问题,尝试使用单个文本时效果很好,但我需要整个集合。
可调用云函数只能 return JSON 类型。您不能 return 整个 QuerySnapshot
,这是您的代码试图做的。
如果你想return文档的数据,那就是:
return { videos: filteredVideo.map((doc) => doc.data()) }
如果您还想 return 每个文档的文档 ID,那就是:
const result = filteredVideo.map((doc) => {
return { id: doc.id, data: doc.data() }
})
return { videos: result }
如果你直接发送 items 数组作为响应,它会抛出异常。
参考 Medium Article 有一些规则需要遵守。
截至异常,没有有效的 JSON 对象。您必须将项目数组转换为对象并在响应中传递后跟键“数据”:
错误 return res.status(200).send(items)
对return res.status(200).send({ data: { items } })
com.google.firebase.functions.FirebaseFunctionsException: 响应无效 JSON 对象。
exports.loadVideos = functions
.region('asia-south1')
.https.onRequest(async (req, res) => {
let uid = []
const subscribers = await db
.collection(SUBSCRIPTIONS_COLLECTION)
.doc('05piDSvu5mNxHOn2yKpnL2V322r1')
.get()
subscribers.data().subsBy.forEach((s) => {
uid.push(s.userId)
})
return db
.collection('videos')
.where('userId', 'not-in', uid)
.get()
.then((snapshot) => {
if (snapshot.empty) {
return res.status(404).send({
error: 'Unable to find the document',
})
}
let items = []
snapshot.docs.forEach((doc) => {
items.push(doc.data())
})
return res.status(200).send(items)
})
.catch((err) => {
console.error(err)
return res.status(404).send({
error: 'Unable to retrieve the document',
err,
})
})
})
无法找出问题,尝试使用单个文本时效果很好,但我需要整个集合。
可调用云函数只能 return JSON 类型。您不能 return 整个 QuerySnapshot
,这是您的代码试图做的。
如果你想return文档的数据,那就是:
return { videos: filteredVideo.map((doc) => doc.data()) }
如果您还想 return 每个文档的文档 ID,那就是:
const result = filteredVideo.map((doc) => {
return { id: doc.id, data: doc.data() }
})
return { videos: result }
如果你直接发送 items 数组作为响应,它会抛出异常。
参考 Medium Article 有一些规则需要遵守。
截至异常,没有有效的 JSON 对象。您必须将项目数组转换为对象并在响应中传递后跟键“数据”:
错误 return res.status(200).send(items)
对return res.status(200).send({ data: { items } })