更具体地描述的新内容
我正在尝试使用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/api
或localhost: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"
}]
}
}
所以,我可以接近的所有端点