Je souhaite créer plusieurs fonctions cloud pour Firebase et les déployer toutes en même temps à partir d'un projet. Je voudrais également séparer chaque fonction dans un fichier séparé. Actuellement, je peux créer plusieurs fonctions si je les mets toutes les deux dans index.js telles que:
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Cependant, je voudrais mettre foo et bar dans des fichiers séparés. J'ai essayé ceci:
/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json
où foo.js est
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
et bar.js est
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Existe-t-il un moyen d'accomplir cela sans mettre toutes les fonctions dans index.js?
javascript
firebase
google-cloud-functions
Jasonsirota
la source
la source
.js
fichiers importés viarequire
: github.com/firebase/functions-samples/tree/masterRéponses:
Ah, Cloud Functions pour Firebase charge normalement les modules de nœuds, donc cela fonctionne
structure:
index.js:
toto.js:
bar.js:
la source
La réponse de @jasonsirota a été très utile. Mais il peut être utile de voir du code plus détaillé, en particulier dans le cas des fonctions déclenchées par HTTP.
En utilisant la même structure que dans la réponse de @ jasonsirota, disons que vous souhaitez avoir deux fonctions de déclenchement HTTP distinctes dans deux fichiers différents:
structure de répertoires:
index.js:
toto.js:
bar.js:
la source
Mise à jour: ce document devrait vous aider , ma réponse est plus ancienne que ce document.
Voici comment je l'ai fait personnellement avec dactylographié:
Permettez-moi de commencer en donnant deux avertissements pour que cela fonctionne:
Pour le point numéro 2, je ne sais pas pourquoi. Secundo, vous devez respecter ma configuration d'index, main et db exactement (au moins pour l'essayer).
index.ts : traite de l'exportation. Je trouve plus propre de laisser index.ts s'occuper des exportations.
main.ts : traite de l'initialisation.
db.ts : il suffit de réexporter la base de données pour que son nom soit plus court que
database()
http-functions.ts
la source
db.ts
entrermain.ts
(après l'instanciation de l'administrateur?). Ou vous êtes-vous simplement séparé de cette manière pour plus de clarté / simplicité?Avec Node 8 LTS désormais disponible avec les fonctions Cloud / Firebase, vous pouvez effectuer les opérations suivantes avec les opérateurs de diffusion:
/package.json
/index.js
/lib/foo.js
la source
unexpected token ...
dans index.js.Pour être simple (mais fait le travail), j'ai personnellement structuré mon code comme ça.
Disposition
foo.ts
bar.ts
db.ts
index.ts
Fonctionne pour les répertoires de tous les niveaux imbriqués. Suivez simplement le modèle à l'intérieur des répertoires.
la source
admin.initializeApp(functions.config().firestore) const db = admin.firestore();
Où mettez-vous cela et comment vous y référez-vous dans foo et bar?db.ts
entrerindex.ts
(après l'instanciation de l'administrateur?). Ou vous êtes-vous simplement séparé de cette manière pour plus de clarté / simplicité?Dans le cas de Babel / Flow, cela ressemblerait à ceci:
Disposition du répertoire
src/index.js
- Principales exportationssrc/db.js
- Client Cloud SQL pour Postgressrc/store.js
- Client Firebase Firestoresrc/someFuncA.js
- Fonction Asrc/someFuncB.js
- Fonction B.babelrc
firebase.json
package.json
la source
bigcodenerd.org esquisse un modèle d'architecture plus simple afin d'avoir des méthodes séparées en différents fichiers et exportées en une seule ligne dans le fichier index.js .
L'architecture du projet dans cet exemple est la suivante:
projectDirectory
index.js
podcast.js
Le même modèle serait utilisé pour la
removeProfile
méthode dans le fichier de profil .la source
Pour être simple (mais fait le travail), j'ai personnellement structuré mon code comme ça.
Disposition
foo.ts
bar.ts
index.ts
Fonctionne pour les répertoires de tous les niveaux imbriqués. Suivez simplement le modèle à l'intérieur des répertoires.
la source
export * from './fooFunctions';
etexport * from './barFunctions';
dans index.ts?Ce format permet à votre point d'entrée de trouver des fichiers de fonctions supplémentaires et d'exporter automatiquement chaque fonction dans chaque fichier.
Script du point d'entrée principal
Recherche tous les fichiers .js dans le dossier des fonctions et exporte chaque fonction exportée à partir de chaque fichier.
Exemple d'exportation de plusieurs fonctions à partir d'un fichier
Les points de terminaison accessibles http sont correctement nommés
Un fichier
Si vous ne disposez que de quelques fichiers supplémentaires (par exemple un seul), vous pouvez utiliser:
la source
J'ai donc ce projet qui a des fonctions d'arrière-plan et des fonctions http. J'ai aussi des tests pour les tests unitaires. CI / CD vous simplifiera la vie lors du déploiement des fonctions cloud
Structure des dossiers
Remarque:
utils/
dossier est pour partager le code entre les fonctionsfonctions / index.js
Ici, vous pouvez simplement importer toutes les fonctions dont vous avez besoin et les déclarer. Pas besoin de logique ici. Cela le rend plus propre à mon avis.
CI / CD
Que diriez-vous d'avoir une intégration et un déploiement continus chaque fois que vous apportez vos modifications au dépôt? Vous pouvez l'avoir en utilisant google google cloud build . C'est gratuit jusqu'à un certain point :) Vérifiez ce lien .
./cloudbuild.yaml
la source
Il existe un très bon moyen d'organiser toutes vos fonctions cloud sur le long terme. Je l'ai fait récemment et cela fonctionne parfaitement.
Ce que j'ai fait, c'est d'organiser chaque fonction cloud dans des dossiers séparés en fonction de leur point de terminaison de déclenchement. Chaque nom de fichier de fonction cloud se termine par
*.f.js
. Par exemple, si vous aviezonCreate
etonUpdate
déclenche suruser/{userId}/document/{documentId}
alors créez deux fichiersonCreate.f.js
etonUpdate.f.js
dans le répertoirefunctions/user/document/
et votre fonction sera nomméeuserDocumentOnCreate
etuserDocumentOnUpdate
respectivement. (1)Voici un exemple de structure de répertoire:
Exemple de fonction
Index.js
(1): Vous pouvez utiliser le nom de votre choix. Pour moi, onCreate.f.js, onUpdate.f.js etc. semblent plus pertinents pour le type de déclencheur qu'ils sont.
la source
*.f.js
fichier. Le moins que vous puissiez faire est de renommer le fichier pour chaque version en ajoutant le suffixe pour en faire quelque chose comme*.v1.f.js
ou*.v2.f.js
etc. (en supposant que toutes vos versions de tous vos déclencheurs http sont actives). Veuillez me faire savoir si vous avez une meilleure solution.J'utilise un bootloader JS vanilla pour inclure automatiquement toutes les fonctions que je souhaite utiliser.
index.js (chargeur de démarrage)
Cet exemple de fichier index.js inclut automatiquement les répertoires de la racine. Il pourrait être étendu pour parcourir les répertoires, honorer .gitignore, etc. Cela me suffisait cependant.
Avec le fichier d'index en place, l'ajout de nouvelles fonctions est simple.
/test/testA.js
/test/testB.js
npm run serve
donne:Ce flux de travail est à peu près juste "écrire et exécuter", sans avoir à modifier le fichier index.js chaque fois qu'une nouvelle fonction / fichier est ajoutée / modifiée / supprimée.
la source
Voici une réponse simple si vous créez des fonctions cloud avec dactylographié.
Près de toutes vos importations régulières en haut, exportez simplement toutes les fonctions à partir de
foo.ts
.export * from './foo';
la source
J'ai passé beaucoup de temps à chercher la même chose, et il y a ce que je pense être le meilleur moyen d'y parvenir (j'utilise [email protected]):
https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
Pas de transpiration ;)
la source