2

我正在 Firebase 云功能和托管之上构建我的网络应用程序。我的客户端是使用 create-react-app 构建的,并且我有一个小型快速服务器在云功能中运行,为应用程序构建提供服务。

在普通浏览器窗口中一切正常,但是,我遇到一个问题,如果我在隐身模式或移动设备中访问任何不是“/”的 url,我会得到 404 和“未找到”

即:直接点击“ https://144blocks.com/week ”将在普通浏览器窗口中正常加载,但在隐身和移动设备中会引发以下错误。

在此处输入图像描述

我为网站提供服务的 firebase 功能是:

函数/index.js

const functions = require('firebase-functions');
const express = require('express');
const fs = require('fs');
const path = require('path');

const app = express();

app.get('/*', (req, res) => {
    const fullPath = path.normalize(__dirname + '/../react-ui/build/index.html');

    res.set('Cache-Control', 'public, max-age=300, s-maxage=600');
    res.sendFile(fullPath);
});

exports.app = functions.https.onRequest(app);

在我的客户中,我的 firebase.json 文件:

firebase.json

{
  "hosting": {
    "public": "react-ui/build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "function": "app"
      }
    ]
  }
}

我不知道为什么除了隐身窗口或移动设备中的“/”之外,我不能直接点击任何路线。理想情况下,我希望我的所有路由都流经app.get(/*我的快速服务器上的路由,并让我的客户端处理路由。

4

3 回答 3

1

Firebase Hosting 目前存在问题,这似乎影响了许多网站,包括我自己的两个网站。您可以通过此链接了解他们的最新状态。

于 2018-02-28T09:55:00.277 回答
0

我仍然不能 100% 确定为什么这会起作用,但是我通过以下方式解决了这个问题: 1. 在我的functions/index.js文件中,更新 ,fullPath因为我相信__dirname + '/../react-ui/build/index.html'没有解决。

我的名字functions/index.js文件:

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

const app = express();

app.get('/*', (req, res) => {
    const fullPath = path.normalize(__dirname + '/build/index.html');

    res.set('Cache-Control', 'public, max-age=300, s-maxage=600');
    res.sendFile(fullPath);
});

exports.app = functions.https.onRequest(app);
  1. 在我的构建过程中,我将构建目录移动到函数文件夹中,以便使用函数部署到 Firebase,因此当我准备部署时,我的项目目录看起来就像构建目录所在的位置functions并且react-ui是相同的: 在此处输入图像描述

如果有人更深入地了解为什么这确实有效,我将不胜感激更多信息。

谢谢!

于 2018-03-22T10:46:43.523 回答
0

尝试运行firebase login。我遇到了这个确切的问题,这是因为我的登录会话已过期。

firebase login --no-localhost或者,如果您在使用标准登录时遇到问题,请尝试。

如果您使用的是 ci/cd,请使用firebase login:ci --no-localhost,将您的 ci 令牌保存到您的环境中FIREBASE_TOKEN并使用firebase deploy --only functions --token $FIREBASE_TOKEN.

于 2019-06-06T11:37:03.913 回答