Я хотел бы создать несколько облачных функций для Firebase и развернуть их одновременно из одного проекта. Я также хотел бы разделить каждую функцию в отдельный файл. В настоящее время я могу создать несколько функций, если я помещу их обе в index.js, например:
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Однако я хотел бы поместить foo и bar в отдельные файлы. Я попробовал это:
/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json
где foo.js
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
и bar.js это
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Есть ли способ сделать это, не помещая все функции в index.js?
javascript
firebase
google-cloud-functions
jasonsirota
источник
источник
.js
файлов, импортированных черезrequire
: github.com/firebase/functions-samples/tree/master/…Ответы:
Ах, Cloud Functions для Firebase загружают модули узлов нормально, так что это работает
структура:
index.js:
foo.js:
bar.js:
источник
Ответ @jasonsirota был очень полезным. Но может быть полезно увидеть более подробный код, особенно в случае запускаемых по HTTP функций.
Используя ту же структуру, что и в ответе @ jasonsirota, предположим, что вы хотите иметь две отдельные функции триггера HTTP в двух разных файлах:
структура каталогов:
index.js:
foo.js:
bar.js:
источник
Обновление: этот документ должен помочь , мой ответ старше этого документа.
Вот как я лично сделал это с машинописью:
Позвольте мне предварить это, дав два предупреждения, чтобы сделать эту работу:
Для пункта № 2 я не уверен почему. Secundo вы должны уважать мою конфигурацию index, main и db точно (по крайней мере, чтобы попробовать).
index.ts : занимается экспортом. Я считаю более понятным позволить index.ts заниматься экспортом.
main.ts : имеет дело с инициализацией.
db.ts : просто переэкспортируйте базу данных, чтобы ее имя было короче
database()
HTTP-functions.ts
источник
db.ts
войти внутрьmain.ts
(после создания администратора?). Или вы только что раскололись для ясности / простоты?С Node 8 LTS, который теперь доступен с Cloud / Firebase Functions, вы можете сделать следующее с помощью операторов распространения:
/package.json
/index.js
/lib/foo.js
источник
unexpected token ...
внутри index.js.Чтобы быть простым (но делает работу), я лично структурировал свой код следующим образом.
раскладка
foo.ts
bar.ts
db.ts
index.ts
Работает для каталогов любых вложенных уровней. Просто следуйте шаблону внутри каталогов тоже.
источник
admin.initializeApp(functions.config().firestore) const db = admin.firestore();
Куда вы кладете это и как относитесь к нему в foo и bar?db.ts
войти внутрьindex.ts
(после создания администратора?). Или вы только что раскололись для ясности / простоты?В случае с Babel / Flow это будет выглядеть так:
Макет каталога
src/index.js
- Основной экспорт (ы)src/db.js
- Облачный SQL-клиент для Postgressrc/store.js
- Firebase Firestore Clientsrc/someFuncA.js
- функция Аsrc/someFuncB.js
- функция B.babelrc
firebase.json
package.json
источник
Схема bigcodenerd.org представляет собой более простой образец архитектуры, позволяющий разделять методы на разные файлы и экспортировать их в одну строку в файле index.js .
Архитектура проекта в этом примере следующая:
projectDirectory
index.js
podcast.js
Тот же шаблон будет использоваться для
removeProfile
метода в файле профиля .источник
Чтобы быть простым (но делает работу), я лично структурировал свой код следующим образом.
раскладка
foo.ts
bar.ts
index.ts
Работает для каталогов любых вложенных уровней. Просто следуйте шаблону внутри каталогов тоже.
источник
export * from './fooFunctions';
иexport * from './barFunctions';
в index.ts?Этот формат позволяет вашей точке входа находить дополнительные файлы функций и автоматически экспортировать каждую функцию в каждый файл.
Сценарий главной точки входа
Находит все файлы .js внутри папки функций и экспортирует каждую функцию, экспортированную из каждого файла.
Пример экспорта нескольких функций из одного файла
http доступные конечные точки имеют соответствующие имена
Один файл
Если у вас есть только несколько дополнительных файлов (например, только один), вы можете использовать:
источник
Так что у меня есть этот проект, который имеет фоновые функции и функции http. У меня также есть тесты для юнит-тестирования. CI / CD значительно облегчит вашу жизнь при развертывании облачных функций
Структура папок
Примечание:
utils/
папка предназначена для обмена кодом между функциямиФункции / index.js
Здесь вы можете просто импортировать все нужные вам функции и объявить их. Не нужно иметь логику здесь. Это делает это чище по моему мнению.
CI / CD-
Как насчет непрерывной интеграции и развертывания каждый раз, когда вы вносите свои изменения в репозиторий? Вы можете получить его с помощью Google Cloud Cloud сборки . Это бесплатно до определенного момента :) Проверьте эту ссылку .
./cloudbuild.yaml
источник
Существует довольно хороший способ организовать все ваши облачные функции на длительный срок. Я сделал это недавно, и это работает без нареканий.
Я организовал каждую облачную функцию в отдельных папках в зависимости от конечной точки запуска. Каждое имя облачной функции заканчивается на
*.f.js
. Например, если у васonCreate
иonUpdate
триггеры наuser/{userId}/document/{documentId}
затем создать два файла ,onCreate.f.js
иonUpdate.f.js
в каталогеfunctions/user/document/
и ваша функция будет называтьсяuserDocumentOnCreate
иuserDocumentOnUpdate
соответственно. (1)Вот пример структуры каталога:
Функция образца
index.js
(1): Вы можете использовать любое имя, которое хотите. Для меня onCreate.f.js, onUpdate.f.js и т. Д. Кажутся более подходящими для того типа триггера, которым они являются.
источник
*.f.js
файле. Наименьшее, что вы можете сделать, - это переименовать файл для каждой версии, добавив суффикс, чтобы сделать его похожим на*.v1.f.js
и*.v2.f.js
т. Д. (При условии, что все ваши версии всех ваших http-триггеров работают). Пожалуйста, дайте мне знать, если у вас есть лучшее решение.Я использую загрузчик vanilla JS для автоматического включения всех функций, которые я хочу использовать.
index.js (загрузчик)
В этом примере файл index.js автоматически включает только каталоги в корневом каталоге. Это может быть расширено, чтобы ходить каталоги, честь .gitignore и т. Д. Это было достаточно для меня, хотя.
При наличии индексного файла добавление новых функций тривиально.
/test/testA.js
/test/testB.js
npm run serve
выходы:Этот рабочий процесс в значительной степени просто «напиши и запусти», без необходимости изменять файл index.js каждый раз, когда новая функция / файл добавляется / модифицируется / удаляется.
источник
Вот простой ответ, если вы создаете облачные функции с машинописью.
Почти все ваши регулярные импорта в верхней части просто экспортируйте все функции из
foo.ts
.export * from './foo';
источник
Я потратил много времени на поиски того же самого, и я думаю, что есть лучший способ добиться этого (я использую firebase@7.3.0):
https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
Нет пота;)
источник