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 } })