我如何使用主机重组来连接firebase主机和云功能



更具体地描述的新内容

我正在尝试使用express和firebase功能进行高级路由。

但当我试图获得我的火球云功能时,我遇到了这个错误

TypeError:无法在Function.handle的/Users/fredricliver/Projects/firebase-test/functions/node_modules/express/lib/router/index.js:635:15读取未定义的属性'apply'(/Users/fredricliver/Projects/firebase-test/functions/node_modules/express/lib/router/index.js:174:3(位于/usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsSimulatorRuntime.js:593:20//usr/local/lib/node_modulesfirebase-tools/lib/emulator/functionsSimulatorRuntime.js:568:19 at Generator.next

/functions/index.js

const functions = require("firebase-functions")
const admin = require("firebase-admin")
const cors = require("cors")
const express = require("express")
const apiRoute = require("./api")
// admin.initializeApp(functions.config().firebase)
const app = express()
app.use(cors)
app.use("/api", apiRoute)
exports.api = functions.https.onRequest(apiRoute)

/函数/api.js

const router = require("express").Router()
router.get("/data", (req, res) => {
res.send(`this is data`)
})
module.exports = router

有人能给我一个解决这个问题的线索吗?


以前的内容

我正在尝试将我的node(与express(项目转换为与Firebase兼容的项目。

我将API端点添加到/functions/index.js

const apiRoute = require("./routes/api")
exports.api = functions.https.onRequest(apiRoute)

在我的api.js 中

router.get("/", (req, res) => {
res.send("api is running on")
})
router.get("/sentences", (req, res) => {
res.send("hi")
})

所以,我的期望是,当我调用localhost:5000/apilocalhost:5000/api/sentences时,我可以得到响应,但它不起作用。

为此,我尝试了.onCall来提交我的云函数,而不是使用.onRequest

但当我调用functions.httpsCallable("endpoint")时,只有POST请求被接受。

因此,我尝试在firebase.json 中使用onRequest和重写进行托管

"hosting": {
"public": "public",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "/api/**",
"function": "api"
}
]
},

但是,我刚刚得到这个错误:

类型错误:无法在下一个读取/Users/fredricliver/Projects/Speech/functions/node_modules/express/lib/router/index.js:635:15处未定义的属性"apply">

我应该如何从前端javascript调用函数?

您的路由应该包括从Firebase Hosting代理的URI的完整路径。

router.get("/api", (req, res) => {
res.send("api is running on")
})
router.get("/api/sentences", (req, res) => {
res.send("hi")
})

我相信你也可以使用use((为应用程序中的每条路由指定一个通用前缀。

我在查看了一个youtube剪辑并尝试了更多内容后解决了这个问题。

在我的中期帖子中进行了总结。https://medium.com/@fredriccliver/如何使用云中的出口-功能-开发-环境-cb64face4043

函数/index.js

const functions = require("firebase-functions")
const express = require("express")
const app = express()
// my routings
const apiRoute = require("./api")
// add routes to the express app.
app.use("/api", apiRoute)
exports.api = functions.https.onRequest(app)

函数/api.js

const router = require("express").Router()
router.get("/api/user/data", (req, res) => {
res.send(`this is /api/user/data`)
})
router.get("/api/data", (req, res) => {
res.send(`this is /api/data`)
})
router.get("/api/api", (req, res) => {
res.send(`here is /api/api`)
})
router.get("/api", (req, res) => {
res.send(`here is /api`)
})
router.get("/data", (req, res) => {
res.send(`here is /data`)
})
router.get("/", (req, res) => {
res.send(`here is /`)
})
module.exports = router

firebase.json


{
"hosting": {
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [{
"source": "/api/**",
"function": "api"
}]
}
}

所以,我可以接近的所有端点

相关内容

  • 没有找到相关文章

最新更新