Vue.js Firebase 托管上的 SPA,通配符重写为 Firebase Cloud Functions
Vue.js SPA on Firebase Hosting with wildcard rewrite to Firebase Cloud Functions
我有一个使用 vue-router 的 vue.js 应用程序。如果我使用 firebase 托管在默认 public 目录中提供应用程序并尝试使用 https 函数,则该函数不会被调用,因为路由器选择路径并尝试呈现路由。
我将应用程序移至 public/app 并相应地更改了 firebase.json 重写(我的应用程序内容通过访问以 /app/** 结尾的 URL 按预期工作)但我仍然无法获得运行.
函数
我尝试使用通配符重写如下
"rewrites": [
{
"source": "/:function",
"function": ":function"
},
{
"source": "/app/**",
"destination": "/app/index.html"
}
]
但这也不起作用(我不确定它是否与函数有关,我在任何地方都找不到示例)。
例如我使用了默认函数 index.js(并且取消了 helloWorld 函数的注释),因此期望 /helloWorld 输出 helloWorld 函数的响应(正如我之前所说,如果我导航到 /app/route,我得到我期望从我的 vue 应用程序输出。
这应该有效吗?或者我需要做一些完全不同的事情吗?
------编辑
在 Doug 的评论之后,我将函数脚本更新为以下内容
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as express from 'express';
const app = express();
app.get("/:function", (req, res) => {
switch(req.params.function) {
case
"helloWorld" : helloWorld(res)
break;
default : res.send("Invalid function requested.")
}
});
function helloWorld(res) {
res.send("Hello world!");
}
exports.api = functions.https.onRequest(app);
这在仅提供功能时按预期工作。
但是当我 运行 firebase 服务时,重写(如下)对于我希望重写到我的函数的 api 路由仍然不起作用:
"rewrites": [
{
"source": "/api/**",
"function": "api"
},
{
"source": "/app/**",
"destination": "/app/index.html"
}
]
我怀疑当 运行ning firebase 服务时,它实际上并没有提供这些功能,因为我没有在终端中列出任何端点。
我让一切都按预期工作,例如以下示例:
functions/src/index.ts
import * as functions from 'firebase-functions';
import * as express from 'express';
const app = express();
app.get("/:function", (req, res) => {
switch(req.params.function) {
case
"helloWorld" : helloWorld(res)
break;
default : res.send("Invalid function requested.")
}
});
app.get("/users/:id", (req, res) => {
res.send("User with ID: " + req.params.id)
});
function helloWorld(res) {
res.send("Hello world!");
}
exports.api = functions.https.onRequest(app);
firebase.json(重定向和重写)
"redirects": [
{
"source": "/",
"destination": "/app/",
"type": 301
}
],
"rewrites": [
{
"source": "/app/**",
"destination": "/app/index.html"
},
{
"source": "/**",
"function": "api"
}
]
我有一个使用 vue-router 的 vue.js 应用程序。如果我使用 firebase 托管在默认 public 目录中提供应用程序并尝试使用 https 函数,则该函数不会被调用,因为路由器选择路径并尝试呈现路由。
我将应用程序移至 public/app 并相应地更改了 firebase.json 重写(我的应用程序内容通过访问以 /app/** 结尾的 URL 按预期工作)但我仍然无法获得运行.
函数我尝试使用通配符重写如下
"rewrites": [
{
"source": "/:function",
"function": ":function"
},
{
"source": "/app/**",
"destination": "/app/index.html"
}
]
但这也不起作用(我不确定它是否与函数有关,我在任何地方都找不到示例)。
例如我使用了默认函数 index.js(并且取消了 helloWorld 函数的注释),因此期望 /helloWorld 输出 helloWorld 函数的响应(正如我之前所说,如果我导航到 /app/route,我得到我期望从我的 vue 应用程序输出。
这应该有效吗?或者我需要做一些完全不同的事情吗?
------编辑
在 Doug 的评论之后,我将函数脚本更新为以下内容
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as express from 'express';
const app = express();
app.get("/:function", (req, res) => {
switch(req.params.function) {
case
"helloWorld" : helloWorld(res)
break;
default : res.send("Invalid function requested.")
}
});
function helloWorld(res) {
res.send("Hello world!");
}
exports.api = functions.https.onRequest(app);
这在仅提供功能时按预期工作。
但是当我 运行 firebase 服务时,重写(如下)对于我希望重写到我的函数的 api 路由仍然不起作用:
"rewrites": [
{
"source": "/api/**",
"function": "api"
},
{
"source": "/app/**",
"destination": "/app/index.html"
}
]
我怀疑当 运行ning firebase 服务时,它实际上并没有提供这些功能,因为我没有在终端中列出任何端点。
我让一切都按预期工作,例如以下示例:
functions/src/index.ts
import * as functions from 'firebase-functions';
import * as express from 'express';
const app = express();
app.get("/:function", (req, res) => {
switch(req.params.function) {
case
"helloWorld" : helloWorld(res)
break;
default : res.send("Invalid function requested.")
}
});
app.get("/users/:id", (req, res) => {
res.send("User with ID: " + req.params.id)
});
function helloWorld(res) {
res.send("Hello world!");
}
exports.api = functions.https.onRequest(app);
firebase.json(重定向和重写)
"redirects": [
{
"source": "/",
"destination": "/app/",
"type": 301
}
],
"rewrites": [
{
"source": "/app/**",
"destination": "/app/index.html"
},
{
"source": "/**",
"function": "api"
}
]