简体   繁体   English

Firebase 托管 + 云功能

[英]Firebase Hosting + Cloud Function

Having diffuclty deploying my functions as well as hosting.难以部署我的功能以及托管。

The thing is, I have gotten them to work independently on seperate branches, however..when trying to integrate both hosting and my cloud functions, it seems that my cloud function does not deploy.问题是,我已经让它们在单独的分支上独立工作,但是……当尝试集成托管和我的云功能时,我的云功能似乎没有部署。 I'm not receiving any errors in my terminal, and when I click 'functions' in the firebase console, it's the default screen as if no functions have deployed.我的终端没有收到任何错误,当我在 firebase 控制台中单击“功能”时,它是默认屏幕,就好像没有部署任何功能一样。

This is my firebase.json for hosting + functions deployment.这是我用于托管 + 功能部署的 firebase.json。 Hosting works here, but functions are not deploying托管在这里工作,但功能没有部署

{
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      },
      {
        "source": "/api/v1/**",
        "function": "webApi"
      }
    ]
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ],
    "source": "functions"
  }
}

Heres my firebase.json with functions only and no hosting这是我的 firebase.json,只有功能,没有托管

{
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "/api/v1/**",
        "function": "webApi"
      }
    ]
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ],
    "source": "functions"
  }
}

And heres my functions/index.js这是我的函数/index.js

const functions = require('firebase-functions')
const admin = require('firebase-admin')
const serviceAccount = require('./serviceAccount.json')

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

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

admin.initializeApp({
  ...,
})
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('/test', (request, response) => {
  response.send('API TEST')
})

app.get('/surveys', (request, response) => {
  const surveyCollection = db.collection('/surveys')
  return (
    surveyCollection
      .get()
      // eslint-disable-next-line promise/always-return
      .then(querySnapshot => {
        let surveyList = []
        querySnapshot.forEach(doc => {
          const survey = doc.data()
          surveyList.push(survey)
        })
        response.send(surveyList)
      })
  )
})

app.get('/surveys/:survey', (request, response) => {
  const surveyId = request.params.survey
  const userAnswers = db.collection(`/surveys/${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,
          })
        })
        response.setHeader('Content-disposition', 'attachment; filename=cna.json')
        response.set('Content-Type', 'application/json')
        response.status(200).send(surveySubmissions)
      })
      .catch(error => {
        console.log(error)
      })
  )
})

Hosting + functions branch, I type 'firebase deploy'托管 + 功能分支,我输入“firebase deploy”

terminal output:

    i  deploying functions, hosting
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint \surveyplus-cna\functions
> eslint .

+  functions: Finished running predeploy script.
i  functions: ensuring necessary APIs are enabled...
+  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (82.32 KB) for uploading
+  functions: functions folder uploaded successfully
i  hosting[surveyplus-effd5]: beginning deploy...
i  hosting[surveyplus-effd5]: found 30 files in build
+  hosting[surveyplus-effd5]: file upload complete
i  functions: updating Node.js 8 function webApi(us-central1)...
+  functions[webApi(us-central1)]: Successful update operation.
i  hosting[surveyplus-effd5]: finalizing version...
+  hosting[surveyplus-effd5]: version finalized
i  hosting[surveyplus-effd5]: releasing new version...
+  hosting[surveyplus-effd5]: release complete

+  Deploy complete!

On cloud function only branch firebase deploy output在云功能上仅分支firebase deploy输出

=== Deploying to '...'...

i  deploying functions, hosting
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint \surveyplus-cna\functions
> eslint .

+  functions: Finished running predeploy script.
i  functions: ensuring necessary APIs are enabled...
+  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (82.33 KB) for uploading
+  functions: functions folder uploaded successfully
i  hosting[surveyplus-effd5]: beginning deploy...
i  hosting[surveyplus-effd5]: found 30 files in build
+  hosting[surveyplus-effd5]: file upload complete
i  functions: updating Node.js 8 function webApi(us-central1)...
+  functions[webApi(us-central1)]: Successful update operation.
i  hosting[surveyplus-effd5]: finalizing version...
+  hosting[surveyplus-effd5]: version finalized
i  hosting[surveyplus-effd5]: releasing new version...
+  hosting[surveyplus-effd5]: release complete

+  Deploy complete!

Your Cloud Functions have deployed correctly, as I can call the /api/v1/test route directly just fine (at the time of writing).您的 Cloud Functions 已正确部署,因为我可以直接调用/api/v1/test路由就好了(在撰写本文时)。

However, in your firebase.json file, the order of your rewrites is incorrect as highlighted in the docs :但是,在您的firebase.json文件中,您的重写顺序不正确,如 文档中突出显示的:

Important: Within the rewrites attribute, the Hosting response will obey the rule specified by the first source glob that captures the requested path.重要提示:rewrites属性中,托管响应将遵循捕获请求路径的第一个source glob指定的规则。

{
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "/api/v1/**",
        "function": "webApi"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ],
    "source": "functions"
  }
}

So instead of sending /api/v1/test calls to be handled by your Cloud Function, they were incorrectly sent to your React app instead.因此,不是发送/api/v1/test调用由您的 Cloud Function 处理,而是错误地发送到您的 React 应用程序。 Swapping the order should fix this.交换订单应该可以解决这个问题。

Another note, if you intend all your calls to be formatted and parsed as JSON, you should reorder the main.use calls.另请注意,如果您打算将所有调用格式化并解析为 JSON,则应重新排序main.use调用。 I'd also use an express Router instead of a complete express() instance.我也会使用一个express 路由器而不是一个完整的express()实例。

const main = express(); // full express instance
const app = express.Router(); // "child" express instance

main.use(bodyParser.json()) // parse body as json, then hand over to app
main.use('/api/v1', app)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM