难以部署我的功能以及托管。
问题是,我让它们在单独的分支上独立工作,但是..当尝试同时集成托管和我的云功能时,似乎我的云功能未部署。我的终端没有收到任何错误,当我在Firebase控制台中单击“功能”时,这是默认屏幕,好像没有部署任何功能。
这是我用于托管+功能部署的firebase.json。 托管在这里有效,但功能尚未部署
{
"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"
}
}
在这里,我的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"
}
}
这是我的函数/ 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)
})
)
})
托管+功能分支,我输入“ 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!
仅在云功能上分支
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!
答案 0 :(得分:1)
您的云功能已正确部署,因为我可以直接写/api/v1/test
路由(在撰写本文时)。
但是,在firebase.json
文件中,重写顺序不正确,如docs中突出显示:
重要:在
rewrites
属性内,托管响应将遵守 firstsource
glob 指定的规则em>捕获请求的路径。
{
"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"
}
}
因此,它们没有发送/api/v1/test
调用来由您的Cloud Function处理,而是被错误地发送到了您的React应用。交换订单可以解决此问题。
另一个说明,如果您打算将所有调用格式化并解析为JSON,则应重新排列main.use
调用的顺序。我还将使用express Router而不是完整的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)