Доставка приложения Node.JS с помощью Firebase
С 2017 года можно доставлять приложение Node.JS с помощью Firebase. Команда Google выпустила демонстрацию двух конечных точек Node.JS, работающих на платформе. Также есть учебник по созданию API с нуля. Что происходит, когда уже разработанное приложение Node.JS необходимо интегрировать с Firebase? Будет проблема.
Чтобы приложение Node.JS работало на платформе, требуется несколько часов на понимание, отладку и устранение неполадок. Надеюсь, эта статья сэкономит вам время на поиск причины основной проблемы, анализ и разработку приложения Node.JS с Firebase тремя разными способами для успешного развертывания.
Что нужно учитывать
Прежде чем говорить об основной проблеме, давайте определим две вещи:
- Структура приложения Node.JS
- Интеграция облачных функций
Во-первых, структура приложения Node.JS.
Структура приложения Node.JS
Структура обычного приложения Node.JS выглядит примерно так:
> bin/ > www.js > src/ > controllers > routes > more modules > test/ > src > app.js > package.json
Хотите прочитать эту историю позже? Сохраните в Журнале.
Сценарий bin/www.js
будет обслуживать приложение, настраивающее HTTP-сервер.
Основная запись приложения - это app.js
, которая настраивает приложение (например, маршруты, промежуточное ПО и т. Д.) И требует источника приложения из каталога src/
.
Каталог test/
содержит *.spec.js
файлов, проверяющих каждый сценарий в каталоге src/
.
Пришло время поговорить об интеграции облачных функций.
Интеграция облачных функций
При установке облачных функций через Firebase CLI по умолчанию создается каталог functions/
с functions/index.jx
в качестве основной записи.
Наиболее естественным подключением будет запрос приложения в основной записи модуля functions
.
// functions/index.js const functions = require('firebase-functions'); const app = require('../app'); exports.app = functions.https.onRequest(app);
Дымовое тестирование проводится во время развертывания путем выполнения команды firebase deploy
. Если это сработает, то этой публикации не будет, и теперь пора поговорить о проблеме.
Проблема
Развертывание облачных функций завершается ошибкой со следующим сообщением:
Cannot find module '../app'
Cloud Functions загружает содержимое каталога functions/
при развертывании, поэтому внутри него не было приложения Node.JS. Вот где начинается наше путешествие, поскольку есть три способа решить эту проблему.
Решения
Есть три способа решить эту проблему. Каждый из них имеет свои плюсы и минусы, что упрощает выборы при различных сценариях.
ПРИМЕЧАНИЕ: все решения имеют общее требование - проект Firebase должен быть настроен с использованием Pay as you go. Это не означает, что существуют требования к оплате, поскольку бесплатная квота достаточно велика для тестирования. Однако для этого требуется наличие учетной записи для выставления счетов. Подробнее читайте на странице Квоты и лимиты.
Решение A. Внутренние функции приложения
Благодаря этому решению структура проекта изменится на следующую форму:
> bin/ > www.js > functions/ > src/ > test/ > app.js > index.js > package.json > package.json
Шаги
- Переместите
app.js
,src/
иtest/
вfunctions/
- Обновите путь к приложению в
functions/index.js
-- const app = require(‘../app’);
++ const app = require(‘./app’);
- Обновите путь к приложению в
bin/www.js
-- var app = require(‘../app’);
++ var app = require(‘../functions/app’); - Путь к тестам должен быть обновлен в
package.json
"test": "nyc — reporter=html mocha — recursive 'functions/test/**/*.js'" - Все
dependencies
(не путать сdevDependencies
) изpackage.json
должны быть установлены наfunctions/package.json
. Например: если@google-cloud/firestore
объявлен как зависимость приложения, его необходимо установить следующим образом.cd functions && npm i @google-cloud/firestore
Плюсы
- Оно работает!
Минусы
- Код в сочетании с решением для хостинга.
Если мы захотим перейти с Firebase на другое решение, будет кошмаром. - Утрата классической структуры приложения Node.JS.
Если посмотреть на корневой уровень проекта, не будет никакого индикатора приложения Node.JS. Вместо этого будет выделено приложение, которое поддерживает только облачные функции. - Двойная установка зависимостей.
Чтобы приложение работало локально, они должны быть установлены наpackage.json
. Чтобы он работал и с облачными функциями, они должны быть установлены наfunctions/package.json
.
Решение Б. Функции в корневом каталоге
Благодаря этому решению структура проекта изменится на следующую форму:
> bin/ > www.js > src/ > test/ > app.js > package.json
Шаги
- Переместить
functions/index.js
на корневой уровень - Обновите путь к приложению в
index.js
-- const app = require(‘../app’);
++ const app = require(‘./app’); - Тщательно интегрируйте
functions/package.json
сpackage.json
. Он состоит, в основном, из следующих подэтапов:
a. Слияниеscripts
b. Слияние
engines
c. Слияниеdependencies
d. СлияниеdevDependencies
- Удалить
functions/
- Обновите конфигурацию пути Cloud Functions из
firebase.json
файла."functions": {
"source": "."
}
Плюсы
- Оно работает!
- Никакого дублирования пакетов NPM.
Минусы
- Это чертовски утомительно.
- Заканчивается двумя точками входа на корневом уровне (
app.js
иindex.js
). - Версия с одним узлом для локальных и облачных функций (
package.json@engines
).
Решение C: зеркало приложения внутри функций
Благодаря этому решению структура проекта изменится на следующую форму:
> bin/ > www.js > functions > index.js > package.json > src/ > test/ > app.js > package.json
Шаги
- Обновите путь к приложению в
index.js
-- const app = require(‘../app’);
++ const app = require(‘./app’); - Все
dependencies
(не путать сdevDependencies
) изpackage.json
должны быть установлены наfunctions/package.json
. Например: если@google-cloud/firestore
объявлен как зависимость приложения, его необходимо установить следующим образом.cd functions && npm i @google-cloud/firestore
- Скопируйте приложение до начала развертывания в модуль функций. Это можно сделать с помощью файла firebase.json, добавив в него следующий блок.
"functions": {"predeploy": "mkdir functions/app && cp -r {app.js,src} functions/app",
"postdeploy": "rm -r functions/app"
}
Плюсы
- Это тоже работает!
- Оригинальная структура приложения практически не изменилась. Приложение Node.JS по-прежнему выглядит точно так, как ожидалось.
- Тот же код, протестированный локально, будет автоматически развернут в облачных функциях.
- Переход с Firebase на другое решение будет таким же простым, как удаление файлов, связанных с Cloud Functions, и включение нового решения.
Минусы
- Необходимо отслеживать зависимости и обязательно устанавливать их дважды.
Это было описание трех найденных мною способов интеграции приложения Node.JS в Firebase. Какой из них правильный, зависит от проекта и его требований. По моему опыту, решение C было лучшим вариантом. В любом случае, может оказаться, что любое другое решение лучше подойдет для другого проекта. Выбор остается за вами.
Заключение
Стоит попробовать и развернуть приложение Node.JS через Firebase. Платформа включает в себя список интересных решений для разработки мобильных и веб-приложений. Он включает расширения, которые ускоряют разработку общих решений
, и интеграции для быстрого подключения к существующим платформам. Интеграция вашего приложения в эту платформу может быть очень удобна как для профессиональных, так и для личных проектов.
Обратная связь
Сообщите мне свои мысли, оставив комментарий здесь или через мой Твиттер-аккаунт. В ожидании ответа от вас!