Запрос различных конечных точек с помощью функции Firestore Cloud. - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь использовать гибкую облачную функцию, которая выполняется в разных конечных точках.

Моя оригинальная облачная функция выглядит следующим образом:

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 отображается в моем браузере.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 27 февраля 2020

Чтобы создать конечную точку GET / survey /: id для получения представления по идентификатору, используйте следующий код в новой облачной функции:

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

Дайте мне знать, работает ли она для вас.

...