javascript - 使用 firestore Cloud Function 请求不同的端点

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

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

我原来的云函数如下所示:

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显示在我的浏览器中。

有人能给我指出正确的方向吗?

最佳答案

要创建 GET/survey/:id 端点以便按 ID 获取提交,请在新的云函数中使用以下代码:

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

请告诉我它是否适合您。

关于javascript - 使用 firestore Cloud Function 请求不同的端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60424953/

相关文章:

javascript - 私有(private)变量是否有 "typical"用法?

javascript - Highcharts 缩放图问题

javascript - 如何动态地 module.export 文件夹中的所有文件?

node.js - Node Express 响应 Cookie 值已编码

google-app-engine - 尽管 readiness_check 返回 200 状态响应,但 Google App Engine 应用程序部署失败

mysql - 连接 CLOUD-SQL 到 Google-Data-Studio,出现什么问题?

javascript - 单击图像时删除标签?

javascript - 在 debounce 函数中使用 requestAnimationFrame 是个好主意吗?

javascript - 语法错误 : Invalid or unexpected token at createScript (vm. js:80:10)

mongodb - 在谷歌云平台上部署mongodb?