如何在 firebase 托管上使用 node.js 处理根路径请求?

how to handle root path request with node.js on firebase hosting?

我正在使用 firebase 托管 + 函数开发网络系统。 尽管在 firebase.json 上指定了重写规则, 部分路由不起作用。

root/
 ├ functions/
 │  ├index.js
 │  ├routes/
 │  │  └ index.js
 │  └views/
 │    ├ index.jade
 │    └ sub.jade
 └ public/
    └index.html // this is created by default. I don't want to use this.

这是我的firebase.json

"rewrites": [{
      "source": "**",
      "function": "app"
    }],

这是 node.js 代码。

router.get('/', function(req, res, next) {
    res.render('index');
});

router.get('/subdir', function(req, res, next) {
    res.render('sub');
});

结果

https://myurl/ -> public/index.html is shown.(not handled on node.js)
https://myurl/ -> handled on node.js

你知道如何在 firebase 主机上使用 node.js 处理根路径请求吗?

参见 https://firebase.google.com/docs/hosting/full-config#hosting_priority_order

Priority order of Hosting responses

The different Firebase Hosting configuration options described on this page can sometimes overlap. If there is a conflict, Hosting determines its response using the following priority order:

  1. Reserved namespaces that begin with a /__/* path segment
  2. Configured redirects
  3. Exact-match static content
  4. Configured rewrites
  5. Custom 404 page
  6. Default 404 page

Exact-match 静态内容的优先级高于配置的重写。

所以https://myurl/获取静态内容/index.html

你能试试移除 public/index.html 吗?


我试过了。我可以重写。

参见https://github.com/zkohi/firebase-hosting-using-functions-samples

你应该检查 https://firebase.google.com/docs/hosting/functions .

  1. 创建一个 的虚拟文件夹。例如:dummyApiFolder
  2. 做一个很简单的云函数。例如。
exports.bla = functions.https.onRequest(async (req, res) => {
    res.send("server bla");
});
  1. 使用以下托管规则
    "hosting": {
        "target": "api",
        "public": "dummyApiFolder",
        "rewrites": [
            {
                "source": "**",
                "function": "bla"
            }
        ]
    }

3.1。 target 仅当您在 .firebaserc 文件

中进行设置时才需要

3.2。 "public": "dummyApiFolder", 是必需的。否则 CLI 将不允许部署

现在 所有 请求都应该转发到 bla

我建议从一个简单的云函数开始的原因是,express 可能设置不正确。这也会给你一个错误,但你最终不知道这是一个 firebase 问题还是代码问题!

很简单!只需将 public 目录中的 index.html 文件重命名为其他名称即可。另外,以防万一:在 firebase.json 文件中,更改 public 属性 的值 从 public.