如何使用托管轮播在Firebase托管和云功能之间进行连接

时间:2020-09-09 11:24:34

标签: firebase express google-cloud-functions firebase-hosting


用于更具体描述的新内容

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

但是当我尝试获取Firebase云功能时出现此错误

TypeError:无法在/Users/fredriccliver/Projects/firebase-test/functions/node_modules/express/lib/router/index.js:635:15下读取未定义的属性“ apply”(/ Users / fredriccliver /在Function.handle(/ Users / fredriccliver / Projects / firebase-test / functions / node_modules / express / lib / router /中的项目/firebase-test/functions/node_modules/express/lib/router/index.js:260:14) index.js:174:3)位于路由器(/Users/fredriccliver/Projects/firebase-test/functions/node_modules/express/lib/router/index.js:47:12)位于/ usr / local / lib / node_modules /在/usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js:568:19在/ usr /的Generator.next()处的firebase-tools / lib / emulator / functionsEmulatorRuntime.js:593:20 __awaiter处新Promise()处的local / lib / node_modules / firebase-tools / lib / emulator / functionsEmulatorRuntime.js:8:71(/usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js: 4:12)

/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)

/functions/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请求。

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

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

但是,我只是遇到了这个错误:

TypeError:无法在/Users/fredriccliver/Projects/Speech/functions/node_modules/express/lib/router/index.js:635:15下读取未定义的属性“应用”

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

2 个答案:

答案 0 :(得分:2)

您的路由应包含Firebase托管代理URI的完整路径。

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

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

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

答案 1 :(得分:0)

检查了YouTube剪辑并尝试了更多内容后,我解决了问题。

总结在我的中等职位上。 Linear regression on raster images - lm complains about NAs

functions / 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)

functions / 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"
    }]
  }
}

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