Firebase使用单页应用程序实现自定义域功能

Firebase使用单页应用程序实现自定义域功能,firebase,google-cloud-functions,single-page-application,firebase-hosting,Firebase,Google Cloud Functions,Single Page Application,Firebase Hosting,我有一个Firebase托管的单页应用程序 我还有3个Firebase功能(联系人、计划、功能),应用程序和外部来源会请求这些功能 我的应用程序有一个自定义域,我想通过它访问我的功能 这是我当前的firebase.jsonconfig { "hosting": { "public": "www", "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], "rewrites": [ {

我有一个Firebase托管的单页应用程序

我还有3个Firebase功能(联系人、计划、功能),应用程序和外部来源会请求这些功能

我的应用程序有一个自定义域,我想通过它访问我的功能

这是我当前的
firebase.json
config

{
  "hosting": {
    "public": "www",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
因此,目前所有流量都流向我的应用程序,路由通过我的SPA处理。目前必须通过
cloudfunctions.net
URL访问我的函数,这并不理想

如何将URL重写条目添加到此配置中,以便可以通过自定义域访问我的功能,并且我的单页应用程序可以处理其余的路由

我为
功能
端点尝试了以下操作:

"rewrites": [
  {
    "source": "/features/**",
    "function": "features"
  },
  {
    "source": "!/features/**",
    "destination": "/index.html"
  }
]
其中,在我的函数
index.js
中,我有:

。。。
exports.plans=functions.https.onRequest(plansApi);
exports.features=functions.https.onRequest(featuresApi);
exports.contact=functions.https.onRequest(contactApi);
但是我收到了
404无法获得/features/123
作为响应?

一些事情:

  • 确保您的
    featuresApi
    处理程序与完整URL路径匹配(例如
    /features/123
    而不是
    /123
    )。Firebase主机将完整路径转发到函数,而不仅仅是
    **
    部分
  • 重写是按顺序解决的,因此无需执行
    /功能/**
    用于第二个重写源代码<代码>**应该可以,因为如果它与
    /features/**
    匹配,它将已经与第一次重写匹配并解析到函数

  • 根据错误消息,似乎(1)是罪魁祸首。

    Brilliant,它是#1,这是有文档记录的吗?我刚刚错过了它?谢谢Michael,我也有同样的问题,自定义域在每个函数中添加完整URL路径后开始工作,如您在p-1中所述。是否有任何解决方法,或者您是否有任何建议使*.cloudfunctions.net上的旧URL保持向后兼容?我在示例代码中添加了一个要点,比如如果你有一个Express应用程序。。。您的POST请求可能是:
    /api/user/:task
    ,您的Express应用程序在变量
    appAPIUser
    中定义,并按如下方式导出:
    exports.appAPIUser=functions.https.onRequest(appAPIUser)
    您应该有一个重写规则,用于像这样命名的主机(包括正确的参数):
    {“source”:/api/user/**”,“function”:“appAPIUser”}
    。在服务器端,如果您使用的是cookie会话(NPM),您可以执行以下操作:
    req.sessionOptions.domain=req.hostname=='us-central1-{{project name}}.cloudfunctions.net'?'{project name}}.web.app':req.hostname;
    req.sessionOptions.secure=req.secure
    。对我来说很好。