Функции Firebase не обслуживают статические файлы с помощью механизма просмотра express.js и EJS

Я исследовал эту проблему в течение последнего месяца и не нашел никаких полезных решений. В настоящее время я пытаюсь разместить веб-сайт, используя функции firebase, а также express.js и механизм просмотра EJS.

Я собираюсь рассмотреть вопрос о передаче статических файлов CSS в файлы EJS. Я просмотрел все, но не могу найти правильный ответ, который помогает.

У меня есть следующая файловая структура (внутри папки функций):

  • публичный
  • взгляды
  • index.js

Вот мой index.js:

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

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// });

var app = express();

app.set('view engine', 'ejs');

// app.use('/static', express.static('public'));
app.use(express.static(__dirname + "/public"));
app.get("/", (request, response) => {
    response.render("test");
})

// app.listen(5000, () => {
    // console.info("Active app on port 5000");
// });
exports.webApp = functions.https.onRequest(app);

Страница, которую он отображает (test.ejs):

<html>

<head>

    <link rel = "stylesheet" href = "style.css" type = "text/css">
</head>


<body></body>
</html>

И, наконец, файл style.css:

html {
    background-color: black;
}

(Style.css делается так вместе с test.ejs только для тестирования, так как у меня были большие проблемы со всем этим)

Я попробовал большинство решений в Интернете, однако все они работают только при локальном запуске приложения express.js и нет с помощью команд firebase serve или deploy. Я полностью потерян в отношении этого, и любая помощь приветствуется.

Я вижу эту проблему с Cloud Run и экспресс-статическим промежуточным ПО. Вы в итоге нашли решение?

Luke Pighetti 24.10.2019 03:34

Не могли бы вы поделиться структурой папок? Спасибо.

CENT1PEDE 08.01.2020 12:52

Вы нашли решение для этого? Я не думаю, что ответ @zemunkh правильный.

daCoda 08.09.2020 02:09

любой, кто сталкивался с этой проблемой, посмотрите мой вопрос и ответ здесь: stackoverflow.com/a/68346542?noredirect=1

CybeX 12.07.2021 13:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
4
2 823
3

Ответы 3

Проблема связана с облачным планом Google.

Вначале все пользователи Firebase используют план Spark, который является абсолютно бесплатным. В последнее время Облако Google мог заблокировать некоторые функции, которые мы использовали бесплатно год назад.

Итак, вам нужно перейти на Облачная консоль Google, затем изменить план вашего проекта, который вы хотите развернуть. Затем, если вы не зарегистрировали свою платежную карту, вы должны сделать это для функции хостинг firebase или функции базы данных.

Через несколько минут он загружает все необходимые файлы, такие как стили CSS, файлы JS, которые отсутствовали при загрузке вашего развернутого веб-сайта.

Затем наслаждайтесь развернутым веб-сайтом. ;)

Я надеюсь, что это оно! У меня точно такая же проблема! Я могу без проблем обслуживать свои статические файлы на локальном хосте, но затем не загружаю их на хостинг Firebase. Я только что обновил свой платежный аккаунт в проекте (5 минут назад), но он все еще не работает. Скрестим пальцы, скоро заработает :)

Sam Sverko 19.08.2019 04:17

Это странно. У меня всегда есть планы на Blaze, но это не работает. Не могли бы вы поделиться со мной своим кодом (конечно, не всем)? Я хочу увидеть структуру файлов и то, как вы настраиваете сервер. Спасибо.

CENT1PEDE 09.01.2020 09:43

Да, каталог в хост-приложении Firebase довольно интригующий. Вы должны проверить этот учебник. У меня работало, насколько я помню. youtube.com/watch?v=LOeioOKUKI8

zemunkh 09.01.2020 17:06

Если вы столкнулись с этой проблемой в июле 2021 г. облачная функция firebase недоступна для плана Spark (бесплатно). Сначала вам необходимо обновить свой проект до плана Blaze (не беспокойтесь! Это план с оплатой по мере использования. В него включен план искры, поэтому с вас не будет взиматься плата, пока вы не превысите лимит). Чтобы перейти на план blaze, вам необходимо настроить платежную информацию на платформе Google Cloud, которая будет направляться автоматически, когда вы выберете обновление.

Вот мой код для настройки движка EJS View в функции firebase:

const functions = require('firebase-functions');                                
    const express = require("express");         
    const app = express();


    app.set("views",__dirname+"/tmp");
    app.set("view engine","pug");
    app.engine('pug', require('pug').__express);
    app.get("/",p3p(p3p.recommended),function(req,res){
       res.render("index");
    });
    app.get("/login",p3p(p3p.recommended),function(req,res){
       res.render("login");
    });
    exports.main = functions.https.onRequest(app);

Я надеюсь, что вы сможете связать его с механизмом просмотра мопсов и настроить свои настройки в функции firebase для обслуживания статических файлов.

TL;DR проблемы:

На обычном хостинге NodeJS и Express необходимо указать каталог вашего статического контента. Поскольку хостинг firebase делает для вас хостинг статического контента (где каталог /public размещен в корне вашего домена),

Решение: вы можете сделать следующее:

  1. просто опустите app.use(express.static(__dirname + "/public")); (поскольку это устраняет попытку хостинга дубликат, которую делает для вас хостинг firebase)
  2. все ваши стили, javascript и т. д. должны опустить часть /public,

Например

от это:

link(rel = "stylesheet", href = "/public/styles/my-styles.css")

к это:

link(rel = "stylesheet", href = "/styles/my-styles.css")

Вы можете проверить это:

  1. Разместите свое приложение с оригиналом (ошибочные/неверные ссылки на статические ресурсы), затем перейдите к ссылке на статические ресурсы — вы должны получить 404 или как минимум сбой при загрузке ресурса.

  2. Используя ту же «неверную» ссылку, опустите часть «.../public...» URL-адреса, ваш статический контент будет отображаться правильно.

Это означает, что хостинг firebase размещает все содержимое каталога /public в корневом каталоге вашего домена.

  1. Затем внесите изменения, удалив функцию статического каталога app.use() и удалите все следы /public в ссылках на статическое содержимое (как показано выше).

  2. Перейдите на свою страницу (включая измененные статические маршруты), ваша страница будет правильно загружаться со всеми вашими стилями, сценариями и т. д. (при условии, что у вас нет неисправного кода;))

Другие вопросы по теме