我在使用 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 函数和 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');
});