【发布时间】:2017-12-11 02:17:13
【问题描述】:
我在 firebase 上有一个基于 express.js 的云函数应用程序,其函数名为 api。要使用自定义域,我正在尝试使用 Firebase 托管重写将特定 URL 路由到函数。
我正在关注有关云功能和 Firebase 托管的官方文档,https://firebase.google.com/docs/hosting/functions,并尝试了许多组合,包括以下内容:
"rewrites": [
{
"source": "/api/**",
"function": "api"
}
]
"rewrites": [
{
"source": "/api/:path1/:dat1/dat",
"function": "api/:path1/:dat1/dat"
}
]
"rewrites": [
{
"source": "/api/path1/dat1/dat",
"function": "api"
}
]
"rewrites": [
{
"source": "/api/*/*/*",
"function": "api"
}
]
遗憾的是,它似乎不适用于任何可能的组合。 我的 express 应用程序有以下我计划使用的 GET 路径:
'/api/users/:userId/:userData'
'/api/users/:userId/:userData/json'
'/api/users/:userId/'
和其他类似的。 :userId 和 :userData 是我请求中的参数,因为它适用于 express.js
所需的功能在
中按预期工作https://my-firebase-app.cloudfunctions.net
但它们不适合
https://my-app.firebaseapp.com
请告诉我这些应该如何工作以及我做错了什么。
编辑: 这是我的云函数导出的示例
const functions = require('firebase-functions');
const express = require('express');
const app = express();
app.get('/users/:userId/:userData/json', (req, res) => {
// Do App stuff here
}
// A couple more app.get in the same format
exports.api = functions.https.onRequest(app);
编辑 2: 在@DougStevenson 的建议下,我尝试了以下配置
我在 firebase.json 中尝试了以下内容,
{
"hosting": {
"rewrites": [
{
"source": "/api",
"function": "api"
}
],
"public": "public"
}
}
但我遇到了同样的问题,该函数从未被调用。 我读到了重写是最后的选择,如果主机中存在文件,它将不会转到指定的功能。(我尝试寻找提到这个 ws 的 SO 帖子,但我找不到它)所以我从主机的公共目录中删除了 404.html 和 index.html 文件,因为无论如何我都不需要它们。但问题仍然存在。
编辑 2: 好的,经过大量试验和错误后,我只需要按以下格式对路径进行硬编码:
rewrites : [
{
"source": "/users/**/**/json",
"function": "api"
},
{
"source": "/api/users/**/**/json",
"function": "api"
}
]
在此之后,快速应用程序配置如下:
app.get('/users/:userId/:userData/json', Foo)
我仍然希望有人能提出更好的方法来完成此任务,而不是在托管重写中手动放入每个所需的 Uri。
【问题讨论】:
-
您能否编辑您的问题以简要显示您的快速应用程序的云功能方面和 https 功能导出?我需要看看你是如何设置的。
-
@DougStevenson 先生,谢谢您的回复。我对基于 JS 的后端相当缺乏经验,所以我保留了大部分内容,如 firebase-examples 所示。
-
您有没有找到解决方案?我也一直在努力解决这个问题......
-
@Pkmmte 不完全是一个解决方案,一个解决方法。详情请查看编辑 2。
-
@AdityaAggarwal 我采取了一种稍微不同的方法来解决这个问题,它基本上涉及使用
main函数包装器。有关更多详细信息,请参阅下面的答案。 :)
标签: express firebase google-cloud-functions firebase-hosting