Firebase 托管上的 Cloud Functions 返回 404 的问题

问题描述 投票:0回答:1

我在使用 Firebase 托管和功能处理(自定义)404 时遇到问题。下面是一个简化的代码,可以在本地主机上正常工作。

但是,当我部署它时,处理 404 似乎存在问题。 Firebase 托管返回 500 而不是 404。

  • https://xxxx.web.app/myfunction/hello
    -> 返回“hello world”
  • https://xxxx.web.app/myfunction/404
    -> 返回 500 错误
  • http://localhost/myfunction/404
    -> 返回(自定义)404

有谁知道这是怎么回事吗?

index.js

const functions = require('firebase-functions');

exports.myfunction = functions.region('asia-east1').runWith({maxInstances: 2}).https.onRequest((request, response) => {
    if (request.path == '/myfunction/hello') {
        return response.send("hello world")
    }

    response.set('X-Cascade', 'PASS');
    return response.status(404).end()
});

firebase.json

{
  "functions": [
    {
      "source": "functions",
      "codebase": "default",
      "ignore": [
        "node_modules",
        ".git",
        "firebase-debug.log",
        "firebase-debug.*.log"
      ]
    }
  ],
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "/myfunction/*",
        "function": "myfunction",
        "region": "asia-east1"
      }
    ]
  }
}

编辑:基本文件结构是这样的:

.
├── firebase.json
├── functions
│   ├── index.js
│   └── package.json
└── public
    ├── 404.html
    └── index.html
firebase google-cloud-functions firebase-hosting
1个回答
0
投票

Firebase 函数和 Firebase 托管在 生产中运行在完全不同的环境中,因此

404.html
文件夹中的
public
文件仅在浏览器触发
404 Not Found error
时才适用,NOT 打开的 firebase 函数从文档中可以看到服务器端。

当您使用本地模拟器时,这是不同的,因为函数模拟器可以访问文件,这就是它在本地工作的原因。

从您的代码中,您有两个选择。

选项1

您可以在

404.html
目录中创建自定义
functions
并将其发送到浏览器,如下所示。

注意:我已删除

X-Cascade
,因为没有必要,并且会导致
500 error
,如您所描述的。

const functions = require('firebase-functions');
 
 exports.myfunction = functions
   .region('asia-east1')
   .runWith({ maxInstances: 2 })
   .https.onRequest((request, response) => {
     if (request.path == '/myfunction/hello') {
       return response.send('hello world');
     }
 
     return response.status(404).sendFile('404.html', { root: __dirname });
   });

选项2

更简单的方法是在您的

firebase.json
中指定路线。

  "hosting": {
    "public": "public",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "/myfunction/hello",
        "function": "myfunction",
        "region": "asia-east1"
      }
    ],
  },

然后在你的云函数中:

const functions = require('firebase-functions');

exports.myfunction = functions
  .region('asia-east1')
  .runWith({ maxInstances: 2 })
  .https.onRequest((request, response) => {
    return response.send('hello world');
  });

© www.soinside.com 2019 - 2024. All rights reserved.