Когда я использую эмулятор хранилища, я изо всех сил пытался связать 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
}
}
}
@RohitKharche, только что добавил файл json.
Возможно, ваш порт 9199
уже занят, если вы работаете в Linux, тогда вы можете убить процесс этого порта, используя npx kill-port 9199
, и он также будет работать в Windows, после чего вы можете попробовать снова запустить эмулятор.
После того, как я останавливаю локальные серверы эмулятора и запускаю команду, процесс прерывается портом, и когда я перезапускаю серверы и посещаю localhost:9199
, я все равно получаю 501 Not Implemented
ошибку.
Ошибка, которой вы поделились, означает, что вы не инициализировали эмулятор хранилища Firebase. Убедитесь, что вы включили его из клиента, используя Инструментируйте свое приложение для общения с эмуляторами
Он инициализирован. Я могу просматривать изображения и загружать URL-адреса, начинающиеся с localhost:9199
в эмуляторе хранилища. В вопросе есть ссылка на другой вопрос, где я показал его инициализацию.
Нет, я не имел в виду, что я имею в виду, что вы выполнили команду firebase emulators:start
, но вы получаете доступ к эмуляторам хранилища Firebase с помощью клиентского SDK с использованием connectStorageEmulator
и делаете запрос на это
Вот как сейчас: if (hostname === "localhost") { connectAuthEmulator(auth, "http://localhost:9099"); connectFirestoreEmulator(db, "localhost", 8080); // connectStorageEmulator(storage, "localhost", 9199); connectFunctionsEmulator(functions, "localhost", 5001); }
Закомментировал localhost:9199
сейчас, но когда не закомментировал и подключил хранилище эмулятора, ошибка осталась. Просто для ясности: когда хранилище эмулятора было подключено, я мог загружать и скачивать видео/изображения локально, внешние сайты не могли получить к нему доступ — вот в чем проблема.
Я думаю, что вы получаете доступ к эмулятору 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.
Обновлять : Давайте еще раз проверим, выполнили ли вы эти шаги или нет, если да, то попробуйте еще раз.
npm init -y
, и настройте проект машинописного текста, как показано в здесь.firebase init
и выберите существующий проект и укажите project_id в cli, затем выберите, какие функции вы хотите использовать в этом случае, выберите Storage: Configure a security rules file for Cloud Storage
и Emulators: Set up local emulators for Firebase products
, затем нажмите Enter.Would you like to download the emulators now?(Y/n)
в качестве подсказки, введите Y и введите. Ваши эмуляторы будут загружены.npm install firebase
, чтобы добавить в проект зависимость от firebase.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 }
firebase emulators:start
, чтобы запустить эмулятор, он выдаст URL-адрес пользовательского интерфейса и настроенные URL-адреса служб эмулятора. Перейдите по URL-адресу пользовательского интерфейса и загрузите изображение в эмулятор хранилища. Вы получите URL-адрес этого изображения следующим образом: http://127.0.0.1:9199/v0/b/<project_id>.appspot.com/...
Ссылка: Инструментируйте свое приложение для общения с эмуляторами
Извините за задержку с ответом. Как узнать, действительно ли это работает, не должно ли localhost:9199
выдавать ошибку Not Implemented
? Я пробовал оба варианта установки useEmulator
на true/false
и process.env.NODE_ENV = "development"
, ничего не изменилось.
Если вы используете пользовательский интерфейс эмулятора Firebase, вы можете увидеть эмулятор хранилища, работающий в пользовательском интерфейсе эмулятора Firebase, и на консоли терминала, где вы запустили firebase emulators:start
, также выдаст локальный URL-адрес для доступа к эмулятору хранилища.
спасибо за ясность. Локальный хост всегда работал. localhost:3000
, localhost:8080
и localhost:9199
, все они работают. Когда я загружаю изображение в эмулятор, я получаю URL-адрес localhost:9199
. Проблема во внешней доступности. Адрес изображения http://localhost:9199/v0/b/default-bucket/...
недоступен для внешних веб-сайтов. Эти веб-сайты помогают оптимизировать и преобразовывать изображения, которые я должен делать локально, прежде чем приступить к работе. Обратите внимание, пока все это происходит, когда я посещаю localhost:9199
все еще Not Implemented
@Coolkid Вы пробовали с http://127.0.0.1:9199/v0/b/<project_id>.appspot.com/...
при условии, что вы настроили проект .firebaserc
со следующей структурой: { "projects": { "default": "<project_id>" } }
Привет @Rohit, да, я пробовал это.
Можете ли вы также поделиться своим файлом
firebase.json
, чтобы подтвердить, что это не проблема с конфигурацией?