Эмулятор Firebase, но живое хранилище

Когда я использую эмулятор хранилища, я изо всех сил пытался связать URL-адреса загрузки с URL-адресами, к которым могут получить доступ сторонние инструменты оптимизации изображений и видео. Производственный URL-адрес Firebase Storage — https://firebasestorage.googleapis.com/... (доступен через Интернет), тогда как URL-адрес локальной среды — http://localhost:9199/... (недоступен).

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

Это работает, но мне интересно, каковы риски для этого?

Есть ли способ лучше?

Обновлено: добавление моего файла json в соответствии с комментарием.

{
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "functions": [
    {
      "source": "functions",
      "codebase": "default",
      "ignore": [
        "node_modules",
        ".git",
        "firebase-debug.log",
        "firebase-debug.*.log"
      ],
      "predeploy": [
        "npm --prefix \"$RESOURCE_DIR\" run lint"
      ]
    }
  ],
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  },
  "storage": {
    "rules": "storage.rules"
  },
  "emulators": {
    "auth": {
      "port": 9099
    },
    "firestore": {
      "port": 8080
    },
    "hosting": {
      "port": 5000
    },
    "storage": {
      "port": 9199
    },
    "ui": {
      "enabled": true,
      "port": 4000
    },
    "singleProjectMode": true,
    "functions": {
      "port": 5001
    }
  }
}

Можете ли вы также поделиться своим файлом firebase.json, чтобы подтвердить, что это не проблема с конфигурацией?

Rohit Kharche 14.04.2023 11:20

@RohitKharche, только что добавил файл json.

Coolkid 14.04.2023 11:31

Возможно, ваш порт 9199 уже занят, если вы работаете в Linux, тогда вы можете убить процесс этого порта, используя npx kill-port 9199, и он также будет работать в Windows, после чего вы можете попробовать снова запустить эмулятор.

Rohit Kharche 14.04.2023 11:47

После того, как я останавливаю локальные серверы эмулятора и запускаю команду, процесс прерывается портом, и когда я перезапускаю серверы и посещаю localhost:9199, я все равно получаю 501 Not Implemented ошибку.

Coolkid 14.04.2023 12:11

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

Rohit Kharche 14.04.2023 13:27

Он инициализирован. Я могу просматривать изображения и загружать URL-адреса, начинающиеся с localhost:9199 в эмуляторе хранилища. В вопросе есть ссылка на другой вопрос, где я показал его инициализацию.

Coolkid 14.04.2023 22:18

Нет, я не имел в виду, что я имею в виду, что вы выполнили команду firebase emulators:start, но вы получаете доступ к эмуляторам хранилища Firebase с помощью клиентского SDK с использованием connectStorageEmulator и делаете запрос на это

Rohit Kharche 15.04.2023 15:26

Вот как сейчас: if (hostname === "localhost") { connectAuthEmulator(auth, "http://localhost:9099"); connectFirestoreEmulator(db, "localhost", 8080); // connectStorageEmulator(storage, "localhost", 9199); connectFunctionsEmulator(functions, "localhost", 5001); } Закомментировал localhost:9199 сейчас, но когда не закомментировал и подключил хранилище эмулятора, ошибка осталась. Просто для ясности: когда хранилище эмулятора было подключено, я мог загружать и скачивать видео/изображения локально, внешние сайты не могли получить к нему доступ — вот в чем проблема.

Coolkid 15.04.2023 19:30
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
8
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Если вы инициализируете без проверки условия для «localhost», вы должны получить результаты. Потому что, если вы использовали typescript здесь, вы могли получить ошибку в имени хоста, например

This comparison appears to be unintentional because the types '() => string' and 'string' have no overlap.
if (hostname === "localhost")
    👆

Вместо того, чтобы инициализировать эмуляторы firebase из клиента, как вы, я рекомендую вам использовать какой-нибудь файл env и добавить одну переменную с именем NODE_ENV = ''development'' и инициализировать на основе этого условия следующим образом:

if (process.env.NODE_ENV === 'development') {
    connectAuthEmulator(auth, "http://localhost:9099");
    connectFirestoreEmulator(db, "localhost", 8080);
    connectDatabaseEmulator(database, "localhost", 9000);
    connectStorageEmulator(storage, "localhost", 9199);
    connectFunctionsEmulator(functions, "localhost", 5001);
}

ИЛИ просто используйте переменную типа const useEmulator: boolean = true; в файле инициализации firebase и проверьте это значение, а когда вы хотите подключиться к рабочему экземпляру firebase, просто сделайте значение useEmulator равным false.

Обновлять : Давайте еще раз проверим, выполнили ли вы эти шаги или нет, если да, то попробуйте еще раз.

  1. Создайте 1 узел-проект, используя npm init -y , и настройте проект машинописного текста, как показано в здесь.
  2. Запустите firebase init и выберите существующий проект и укажите project_id в cli, затем выберите, какие функции вы хотите использовать в этом случае, выберите Storage: Configure a security rules file for Cloud Storage и Emulators: Set up local emulators for Firebase products, затем нажмите Enter.
  3. Выберите эмулятор хранилища, когда firebase cli спросит, какие эмуляторы выбрать. Нажмите Enter. Вы получите Would you like to download the emulators now?(Y/n) в качестве подсказки, введите Y и введите. Ваши эмуляторы будут загружены.
  4. Запустите npm install firebase, чтобы добавить в проект зависимость от firebase.
  5. Затем создайте папку src и создайте файл firebase.ts, затем добавьте свои учетные данные firebase следующим образом:
// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
import { connectAuthEmulator, getAuth } from "firebase/auth";
import { connectDatabaseEmulator, getDatabase } from "firebase/database";
import { connectFirestoreEmulator, getFirestore } from "firebase/firestore";
import { connectFunctionsEmulator, getFunctions } from "firebase/functions";
import { connectStorageEmulator, getStorage } from "firebase/storage";

const firebaseConfig = { … };

const useEmulator: boolean = true;

// Initialize Firebase Services
const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
const db = getFirestore(app);
const database = getDatabase(app);
const storage = getStorage(app);
const functions = getFunctions(app);

if (useEmulator) {
    connectAuthEmulator(auth, "http://localhost:9099");
    connectFirestoreEmulator(db, "localhost", 8080);
    connectDatabaseEmulator(database, "localhost", 9000);
    connectStorageEmulator(storage, "localhost", 9199);
    connectFunctionsEmulator(functions, "localhost", 5001);
} else console.info("If Block has been Skipped");
export { auth, db, database, storage, functions }
  1. Запустите firebase emulators:start, чтобы запустить эмулятор, он выдаст URL-адрес пользовательского интерфейса и настроенные URL-адреса служб эмулятора. Перейдите по URL-адресу пользовательского интерфейса и загрузите изображение в эмулятор хранилища. Вы получите URL-адрес этого изображения следующим образом: http://127.0.0.1:9199/v0/b/<project_id>.appspot.com/...
  2. Это гарантирует, что ваша конфигурация верна и со стороны firebase не возникнет проблем, если таковые возникнут, вы можете связаться со службой поддержки firebase.

Ссылка: Инструментируйте свое приложение для общения с эмуляторами

Извините за задержку с ответом. Как узнать, действительно ли это работает, не должно ли localhost:9199 выдавать ошибку Not Implemented? Я пробовал оба варианта установки useEmulator на true/false и process.env.NODE_ENV = "development", ничего не изменилось.

Coolkid 17.04.2023 16:29

Если вы используете пользовательский интерфейс эмулятора Firebase, вы можете увидеть эмулятор хранилища, работающий в пользовательском интерфейсе эмулятора Firebase, и на консоли терминала, где вы запустили firebase emulators:start, также выдаст локальный URL-адрес для доступа к эмулятору хранилища.

Rohit Kharche 18.04.2023 07:39

спасибо за ясность. Локальный хост всегда работал. localhost:3000, localhost:8080 и localhost:9199, все они работают. Когда я загружаю изображение в эмулятор, я получаю URL-адрес localhost:9199. Проблема во внешней доступности. Адрес изображения http://localhost:9199/v0/b/default-bucket/... недоступен для внешних веб-сайтов. Эти веб-сайты помогают оптимизировать и преобразовывать изображения, которые я должен делать локально, прежде чем приступить к работе. Обратите внимание, пока все это происходит, когда я посещаю localhost:9199 все еще Not Implemented

Coolkid 18.04.2023 11:44

@Coolkid Вы пробовали с http://127.0.0.1:9199/v0/b/<project_id>.appspot.com/... при условии, что вы настроили проект .firebaserc со следующей структурой: { "projects": { "default": "<project_id>" } }

Rohit Kharche 21.04.2023 07:55

Привет @Rohit, да, я пробовал это.

Coolkid 22.04.2023 09:11

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