Gostaria de criar várias funções de nuvem para o Firebase e implantá-las todas ao mesmo tempo em um projeto. Eu também gostaria de separar cada função em um arquivo separado. Atualmente, posso criar várias funções se colocá-las no index.js, como:
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
No entanto, eu gostaria de colocar foo e bar em arquivos separados. Eu tentei isso:
/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json
onde está foo.js
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
e bar.js é
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Existe uma maneira de fazer isso sem colocar todas as funções no index.js?
javascript
firebase
google-cloud-functions
jasonsirota
fonte
fonte
.js
arquivos importados através derequire
: github.com/firebase/functions-samples/tree/master/...Respostas:
Ah, o Cloud Functions para Firebase carrega módulos de nó normalmente, então isso funciona
estrutura:
index.js:
foo.js:
bar.js:
fonte
A resposta de @jasonsirota foi muito útil. Mas pode ser útil ver um código mais detalhado, especialmente no caso de funções acionadas por HTTP.
Usando a mesma estrutura da resposta de @ jasonsirota, digamos que você queira ter duas funções de gatilho HTTP separadas em dois arquivos diferentes:
estrutura de diretórios:
index.js:
foo.js:
bar.js:
fonte
Atualização: este documento deve ajudar , minha resposta é mais antiga que este documento.
Aqui está como eu pessoalmente fiz isso com texto datilografado:
Permitam-me que anteceda isso, dando dois avisos para que isso funcione:
Para o ponto número 2, não sei por que. Secundo, você deve respeitar minha configuração de index, main e db exatamente (pelo menos para testá-lo).
index.ts : trata de exportação. Acho mais fácil deixar o index.ts lidar com as exportações.
main.ts : Lida com a inicialização.
db.ts : basta reexportar o db para que seu nome seja menor que
database()
http-functions.ts
fonte
db.ts
entrarmain.ts
(após a instanciação do administrador?). Ou você acabou de se separar dessa maneira por clareza / simplicidade?Com o Node 8 LTS agora disponível com as funções Cloud / Firebase, você pode fazer o seguinte com operadores espalhados:
/package.json
/index.js
/lib/foo.js
fonte
unexpected token ...
dentro do index.js.Para ser simples (mas funciona), eu estruturei pessoalmente meu código assim.
Layout
foo.ts
bar.ts
db.ts
index.ts
Funciona para diretórios de qualquer nível aninhado. Apenas siga o padrão dentro dos diretórios também.
fonte
admin.initializeApp(functions.config().firestore) const db = admin.firestore();
Onde você coloca isso e como você se refere a ele em foo e bar?db.ts
entrarindex.ts
(após a instanciação do administrador?). Ou você acabou de se separar dessa maneira por clareza / simplicidade?No caso de Babel / Flow , ficaria assim:
Layout do diretório
src/index.js
- Principais exportações)src/db.js
- Cloud SQL Client para Postgressrc/store.js
- Cliente Firestore Firebasesrc/someFuncA.js
- Função Asrc/someFuncB.js
- Função B.babelrc
firebase.json
package.json
fonte
O esboço do bigcodenerd.org é um padrão de arquitetura mais simples para que os métodos sejam separados em arquivos diferentes e exportados em uma linha no index.js arquivo .
A arquitetura do projeto neste exemplo é a seguinte:
projectDirectory
index.js
podcast.js
O mesmo padrão seria usado para o
removeProfile
método no arquivo de perfil .fonte
Para ser simples (mas funciona), eu estruturei pessoalmente meu código assim.
Layout
foo.ts
bar.ts
index.ts
Funciona para diretórios de qualquer nível aninhado. Apenas siga o padrão dentro dos diretórios também.
fonte
export * from './fooFunctions';
eexport * from './barFunctions';
no index.ts?Esse formato permite que seu ponto de entrada encontre arquivos de funções adicionais e exporte cada função dentro de cada arquivo automaticamente.
Script do ponto de entrada principal
Localiza todos os arquivos .js dentro da pasta de funções e exporta cada função exportada de cada arquivo.
Exemplo de exportação de várias funções de um arquivo
pontos de extremidade acessíveis http são nomeados apropriadamente
Um arquivo
Se você tiver apenas alguns arquivos adicionais (por exemplo, apenas um), poderá usar:
fonte
Então, eu tenho esse projeto que tem funções em segundo plano e funções http. Eu também tenho testes para testes de unidade. O CI / CD facilitará sua vida ao implantar funções na nuvem
Estrutura de pastas
Nota:
utils/
pasta é para compartilhar código entre funçõesfunctions / index.js
Aqui você pode apenas importar todas as funções necessárias e declará-las. Não há necessidade de lógica aqui. Isso torna mais limpo na minha opinião.
CI / CD
Que tal ter integração e implantação contínuas toda vez que você envia suas alterações ao repositório? Você pode obtê-lo usando o google google cloud build . É grátis até um certo ponto :) Verifique este link .
./cloudbuild.yaml
fonte
Existe uma maneira muito boa de organizar todas as suas funções de nuvem a longo prazo. Eu fiz isso recentemente e está funcionando perfeitamente.
O que fiz foi organizar cada função da nuvem em pastas separadas com base no ponto de extremidade do acionador. Todo nome de arquivo da função de nuvem termina com
*.f.js
. Por exemplo, se você tiver ativadoonCreate
eonUpdate
acionadouser/{userId}/document/{documentId}
, crie dois arquivosonCreate.f.js
eonUpdate.f.js
no diretório,functions/user/document/
e sua função será nomeadauserDocumentOnCreate
euserDocumentOnUpdate
respectivamente. (1)Aqui está uma estrutura de diretório de exemplo:
Função de amostra
Index.js
(1): Você pode usar qualquer nome que desejar. Para mim, onCreate.f.js, onUpdate.f.js etc. parecem mais relevantes para o tipo de gatilho que são.
fonte
*.f.js
arquivo. O mínimo que você pode fazer é renomear o arquivo para cada versão, acrescentando o sufixo para torná-lo algo parecido*.v1.f.js
ou*.v2.f.js
etc. (Supondo que todas as suas versões de todo o seu gatilho http estejam ativas). Entre em contato se você tiver uma solução melhor.Eu uso um carregador de inicialização JS vanilla para incluir automaticamente todas as funções que eu quero usar.
index.js (carregador de inicialização)
Este arquivo index.js de exemplo inclui apenas diretórios automaticamente na raiz. Poderia ser expandido para procurar diretórios, honrar .gitignore, etc. Isso foi o suficiente para mim.
Com o arquivo de índice no lugar, adicionar novas funções é trivial.
/test/testA.js
/test/testB.js
npm run serve
rendimentos:Esse fluxo de trabalho é basicamente "gravação e execução", sem a necessidade de modificar o arquivo index.js sempre que uma nova função / arquivo é adicionada / modificada / removida.
fonte
Aqui está uma resposta simples se você estiver criando funções de nuvem com texto datilografado.
Perto de todas as suas importações regulares no topo, basta exportar todas as funções de
foo.ts
.export * from './foo';
fonte
Passei muito tempo procurando o mesmo, e existe a melhor maneira de alcançá-lo (estou usando o [email protected]):
https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
Sem suor;)
fonte