【问题标题】:Requesting different endpoints with firestore Cloud Function使用 firestore Cloud Function 请求不同的端点
【发布时间】:2026-01-14 07:00:02
【问题描述】:

我正在尝试拥有一个在不同端点上执行的灵活云函数。

我原来的云函数是这样的:

const functions = require('firebase-functions')
const admin = require('firebase-admin')
const _ = require('lodash')
const { getObjectValues } = require('./helper-functions.js')
admin.initializeApp()

const json2csv = require('json2csv').parse
exports.csvJsonReport = functions.https.onRequest((request, response) => {
  const db = admin.firestore()
  const userAnswers = db.collection('/surveys/CNA/submissions')
  return (
    userAnswers
      .get()
      // eslint-disable-next-line promise/always-return
      .then(querySnapshot => {
        let surveySubmissions = []
        querySnapshot.forEach(doc => {
          const userSubmission = doc.data()
          surveySubmissions.push({
            ..._.mapValues(userSubmission.answers, getObjectValues), // format answers
            ...userSubmission.anonUser,
          })
        })

        const csv = json2csv(surveySubmissions)
        response.setHeader('Content-disposition', 'attachment; filename=cna.csv')
        response.set('Content-Type', 'text/csv')
        response.status(200).send(csv)
      })
      .catch(error => {
        console.log(error)
      })
  )
})

我正在尝试扩展此功能以处理多个集合。在上述函数中,我的目标是 CNA 集合。所以不是db.collection('/surveys/CNA/submissions/'),我希望它是db.collection('/surveys/:surveyId/submissions/')

以下是我尝试扩展我原来的云功能的尝试:

const functions = require('firebase-functions')
const admin = require('firebase-admin')

const express = require('express')
const bodyParser = require('body-parser')

const _ = require('lodash')
const { getObjectValues } = require('./helper-functions.js')

admin.initializeApp(functions.config().firebase)
const db = admin.firestore()

const app = express()
const main = express()

main.use('/api/v1', app)
main.use(bodyParser.json())

exports.webApi = functions.https.onRequest(main)

app.get('surveys/:id', (request, response) => {
  const surveyId = request.query
  const userAnswers = db.collection(`/survey/${surveyId}/submissions`)
  return (
    userAnswers
      .get()
      // eslint-disable-next-line promise/always-return
      .then(querySnapshot => {
        let surveySubmissions = []
        querySnapshot.forEach(doc => {
          const userSubmission = doc.data()
          surveySubmissions.push({
            ..._.mapValues(userSubmission.answers, getObjectValues), // format answers
            ...userSubmission.anonUser,
          })
        })

        const csv = json2csv(surveySubmissions)
        response.setHeader('Content-disposition', 'attachment; filename=cna.csv')
        response.set('Content-Type', 'text/csv')
        response.status(200).send(csv)
      })
      .catch(error => {
        console.log(error)
      })
  )
})

当我请求我的端点时:myapp.firebaseapp.com/api/v1/surveys/CNA Cannot GET /api/v1/surveys/CNA 显示在我的浏览器中。

有人可以指点我正确的方向吗?

【问题讨论】:

    标签: javascript express google-cloud-platform google-cloud-functions


    【解决方案1】:

    要创建一个 GET /survey/:id 端点以便按 id 获取提交,请在新的 Cloud Function 中使用以下代码:

    app.get('surveys/:id', (request, response) => {
      const surveyId = request.params.id
      const userAnswers = db.collection(`/survey/${surveyId}/submissions`)
    
    

    让我知道它是否适合你。

    【讨论】: