Me gustaría crear múltiples funciones en la nube para Firebase e implementarlas todas al mismo tiempo desde un proyecto. También me gustaría separar cada función en un archivo separado. Actualmente puedo crear múltiples funciones si las pongo en index.js como:
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Sin embargo, me gustaría poner foo y bar en archivos separados. Intenté esto:
/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json
donde foo.js es
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
y bar.js es
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
¿Hay alguna manera de lograr esto sin poner todas las funciones en index.js?
javascript
firebase
google-cloud-functions
jasonsirota
fuente
fuente
.js
archivos importados a través derequire
: github.com/firebase/functions-samples/tree/master/…Respuestas:
Ah, las funciones de nube para los módulos de nodo de carga de Firebase normalmente, así que esto funciona
estructura:
index.js:
foo.js:
bar.js:
fuente
La respuesta de @jasonsirota fue muy útil. Pero puede ser útil ver un código más detallado, especialmente en el caso de las funciones activadas por HTTP.
Usando la misma estructura que en la respuesta de @ jasonsirota, digamos que desea tener dos funciones de disparo HTTP separadas en dos archivos diferentes:
estructura de directorios:
index.js:
foo.js:
bar.js:
fuente
Actualización: este documento debería ayudar , mi respuesta es anterior a este documento.
Así es como lo hice personalmente con mecanografiado:
Permítanme presentar esto dando dos advertencias para que esto funcione:
Para el punto número 2 no estoy seguro de por qué. Secundo debes respetar mi configuración de index, main y db exactamente (al menos para probarlo).
index.ts : trata con la exportación. Me parece más limpio dejar que index.ts se ocupe de las exportaciones.
main.ts : se ocupa de la inicialización.
db.ts : simplemente reexportando el db para que su nombre sea más corto que
database()
http-functions.ts
fuente
db.ts
entrar los contenidos demain.ts
(después de la instancia de administrador?). ¿O simplemente te has separado de esta manera por claridad / simplicidad?Con el Nodo 8 LTS ahora disponible con Cloud / Firebase Functions, puede hacer lo siguiente con los operadores de propagación:
/package.json
/index.js
/lib/foo.js
fuente
unexpected token ...
dentro de index.js.Para ser simple (pero hace el trabajo), personalmente he estructurado mi código de esta manera.
Diseño
foo.ts
bar.ts
db.ts
index.ts
Funciona para directorios de cualquier nivel anidado. Simplemente siga el patrón dentro de los directorios también.
fuente
admin.initializeApp(functions.config().firestore) const db = admin.firestore();
¿Dónde pones esto y cómo te refieres a él en foo and bar?db.ts
entrar los contenidos deindex.ts
(después de la instanciación de administrador?). ¿O simplemente te has separado de esta manera por claridad / simplicidad?En el caso de Babel / Flow se vería así:
Diseño de directorio
src/index.js
- Exportaciones principales)src/db.js
- Cloud SQL Client para Postgressrc/store.js
- Cliente de Firebase Firestoresrc/someFuncA.js
- Función Asrc/someFuncB.js
- Función B.babelrc
firebase.json
package.json
fuente
El esquema bigcodenerd.org es un patrón de arquitectura más simple para separar los métodos en diferentes archivos y exportarlos en una línea dentro del archivo index.js .
La arquitectura para el proyecto en este ejemplo es la siguiente:
projectDirectory
index.js
podcast.js
Se usaría el mismo patrón para el
removeProfile
método en el archivo de perfil .fuente
Para ser simple (pero hace el trabajo), personalmente he estructurado mi código de esta manera.
Diseño
foo.ts
bar.ts
index.ts
Funciona para directorios de cualquier nivel anidado. Simplemente siga el patrón dentro de los directorios también.
fuente
export * from './fooFunctions';
yexport * from './barFunctions';
en index.ts?Este formato permite que su punto de entrada encuentre archivos de funciones adicionales y exporte cada función dentro de cada archivo, automáticamente.
Script de punto de entrada principal
Encuentra todos los archivos .js dentro de la carpeta de funciones y exporta cada función exportada desde cada archivo.
Ejemplo de exportación de múltiples funciones desde un archivo
los puntos finales accesibles http se denominan adecuadamente
Un archivo
Si solo tiene unos pocos archivos adicionales (por ejemplo, solo uno), puede usar:
fuente
Así que tengo este proyecto que tiene funciones de fondo y funciones http. También tengo pruebas para pruebas unitarias. CI / CD te facilitará la vida al implementar funciones en la nube
Estructura de carpetas
Nota: la
utils/
carpeta es para compartir código entre funcionesfunciones / index.js
Aquí puede importar todas las funciones que necesita y declararlas. No es necesario tener lógica aquí. Lo hace más limpio en mi opinión.
CI / CD
¿Qué le parece tener una integración y una implementación continuas cada vez que envía sus cambios al repositorio? Puedes tenerlo usando google google cloud build . Es gratis hasta cierto punto :) Mira este enlace .
./cloudbuild.yaml
fuente
Hay una forma bastante buena de organizar todas sus funciones en la nube a largo plazo. Hice esto recientemente y está funcionando perfectamente.
Lo que hice fue organizar cada función de la nube en carpetas separadas según su punto final de activación. Cada nombre de archivo de función de nube termina con
*.f.js
. Por ejemplo, si teníaonCreate
yonUpdate
activadoresuser/{userId}/document/{documentId}
, cree dos archivosonCreate.f.js
yonUpdate.f.js
en el directoriofunctions/user/document/
y su función se nombraráuserDocumentOnCreate
yuserDocumentOnUpdate
respectivamente. (1)Aquí hay una estructura de directorio de muestra:
Función de muestra
Index.js
(1): puede usar el nombre que desee. Para mí, onCreate.f.js, onUpdate.f.js, etc. parecen más relevantes para el tipo de disparador que son.
fuente
*.f.js
archivo. Lo menos que puede hacer es cambiar el nombre del archivo para todas las versiones anteponiendo el sufijo para que sea algo parecido*.v1.f.js
o*.v2.f.js
etc (Suponiendo que todas sus versiones de la totalidad de su gatillo http son en vivo). Avíseme si tiene una mejor solución.Utilizo un cargador de arranque JS de vainilla para incluir automáticamente todas las funciones que quiero usar.
index.js (gestor de arranque)
Este archivo index.js de ejemplo solo incluye automáticamente directorios dentro de la raíz. Se podría ampliar para recorrer directorios, honrar .gitignore, etc. Sin embargo, esto fue suficiente para mí.
Con el archivo de índice en su lugar, agregar nuevas funciones es trivial.
/test/testA.js
/test/testB.js
npm run serve
rendimientos:Este flujo de trabajo es simplemente "escribir y ejecutar", sin tener que modificar el archivo index.js cada vez que se agrega / modifica / elimina una nueva función / archivo.
fuente
Aquí hay una respuesta simple si está creando funciones en la nube con mecanografiado.
Cerca de todas sus importaciones regulares en la parte superior, simplemente exporte todas las funciones
foo.ts
.export * from './foo';
fuente
Pasé mucho tiempo buscando lo mismo, y creo que es la mejor manera de lograrlo (estoy usando [email protected]):
https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
Sin sudar ;)
fuente