Come strutturare le funzioni cloud per Firebase per distribuire più funzioni da più file?


164

Vorrei creare più funzioni cloud per Firebase e distribuirle tutte contemporaneamente da un progetto. Vorrei anche separare ogni funzione in un file separato. Attualmente posso creare più funzioni se le inserisco entrambe in index.js come:

exports.foo = functions.database.ref('/foo').onWrite(event => {
    ...
});

exports.bar = functions.database.ref('/bar').onWrite(event => {
    ...
});

Tuttavia, vorrei mettere foo e bar in file separati. Ho provato questo:

/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json

dove si trova foo.js

exports.foo = functions.database.ref('/foo').onWrite(event => {
    ...
});

e bar.js è

exports.bar = functions.database.ref('/bar').onWrite(event => {
    ...
});

C'è un modo per ottenere questo risultato senza mettere tutte le funzioni in index.js?


1
@JPVentura. Davvero non ti capisco bene. Spiega per favore.
HuyLe,

È stato aggiornato per la versione 1.0? Ho dei problemi: stackoverflow.com/questions/50089807/...
tccpg288

2
Cordiali saluti, questo esempio ufficiale di funzioni Firebase contiene diversi .jsfile importati tramite require: github.com/firebase/functions-samples/tree/master/…
xanderiel

Questo potrebbe essere utile: stackoverflow.com/questions/43486278/…
Ramesh-X

Risposte:


126

Ah, le funzioni cloud per Firebase caricano normalmente i moduli nodo, quindi funziona

struttura:

/functions
|--index.js
|--foo.js
|--bar.js
|--package.json

index.js:

const functions = require('firebase-functions');
const fooModule = require('./foo');
const barModule = require('./bar');

exports.foo = functions.database.ref('/foo').onWrite(fooModule.handler);
exports.bar = functions.database.ref('/bar').onWrite(barModule.handler);

foo.js:

exports.handler = (event) => {
    ...
};

bar.js:

exports.handler = (event) => {
    ...
};

1
Posso ad esempio avere diverse funzioni nel modulo foo? In tal caso, come è meglio implementarlo?
Alexander Khitev

1
Suppongo che tu possa, e assegnare gestori diversi a diverse funzioni esportate da foo: exports.bar = Functions.database.ref ('/ foo'). OnWrite (fooModule.barHandler); exports.baz = Functions.database.ref ('/ bar'). onWrite (fooModule.bazHandler);
Jasonsirota,

44
Non mi piace questa soluzione perché sposta le informazioni (in particolare i percorsi del database) da foo.js e bar.js in index.js che in qualche modo sconfigge il punto di avere quei file separati.
bvs

Sono d'accordo con @bvs, penso che Ced abbia un buon approccio. Ho intenzione di modificarlo leggermente esportando esplicitamente ogni modulo per rendere index.ts super chiaro, ad esempio esportare {newUser} da "./authenticationFunctions"
Alan

2
Penso che la mia domanda originale fosse semplicemente quella di distribuire più funzioni con 1 progetto senza mettere le funzioni nel file index.js, dove e come si passano le informazioni del database non rientrano nell'ambito. Se fossi io, probabilmente avrei creato un modulo separato che controllava l'accesso al database e lo richiedeva separatamente in foo.js e bar.js, ma questa è una decisione stilistica.
Jasonsirota,

75

La risposta di @jasonsirota è stata molto utile. Ma può essere utile vedere un codice più dettagliato, specialmente nel caso delle funzioni innescate HTTP.

Utilizzando la stessa struttura della risposta di @ jasonsirota, supponiamo di voler avere due funzioni trigger HTTP separate in due file diversi:

struttura delle directory:

    /functions
       |--index.js
       |--foo.js
       |--bar.js
       |--package.json`

index.js:

'use strict';
const fooFunction = require('./foo');
const barFunction = require('./bar');

// Note do below initialization tasks in index.js and
// NOT in child functions:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase); 
const database = admin.database();

// Pass database to child functions so they have access to it
exports.fooFunction = functions.https.onRequest((req, res) => {
    fooFunction.handler(req, res, database);
});
exports.barFunction = functions.https.onRequest((req, res) => {
    barFunction.handler(req, res, database);
});

foo.js:

 exports.handler = function(req, res, database) {
      // Use database to declare databaseRefs:
      usersRef = database.ref('users');
          ...
      res.send('foo ran successfully'); 
   }

bar.js:

exports.handler = function(req, res, database) {
  // Use database to declare databaseRefs:
  usersRef = database.ref('users');
      ...
  res.send('bar ran successfully'); 
}

L'attuale struttura in index.js non ha funzionato bene per me. Quello che dovevo fare era importare prima i moduli firebase, quindi inizializzare l'app e quindi importare le funzioni dalle altre cartelle. In questo modo la mia app viene inizialmente inizializzata, autenticata, qualunque cosa, quindi importa le funzioni che richiedono prima l'inizializzazione dell'app.
Tonkatata,

47

Aggiornamento: questo documento dovrebbe aiutare , la mia risposta è più vecchia di questo documento.


Ecco come l'ho fatto personalmente con dattiloscritto:

/functions
   |--src
      |--index.ts
      |--http-functions.ts
      |--main.js
      |--db.ts
   |--package.json
   |--tsconfig.json

Permettetemi di prefigurare questo dando due avvertimenti per far funzionare questo:

  1. l'ordine delle questioni di importazione / esportazione in index.ts
  2. il db deve essere un file separato

Per il punto numero 2 non sono sicuro del perché. In secondo luogo dovresti rispettare esattamente la mia configurazione di index, main e db (almeno per provarlo).

index.ts : si occupa dell'esportazione. Trovo più pulito lasciare che index.ts gestisca le esportazioni.

// main must be before functions
export * from './main';
export * from "./http-functions";

main.ts : gestisce l' inizializzazione.

import { config } from 'firebase-functions';
import { initializeApp } from 'firebase-admin';

initializeApp(config().firebase);
export * from "firebase-functions";

db.ts : riesporta semplicemente il db in modo che il suo nome sia più breve didatabase()

import { database } from "firebase-admin";

export const db = database();

http-functions.ts

// db must be imported like this
import { db } from './db';
// you can now import everything from index. 
import { https } from './index';  
// or (both work)
// import { https } from 'firebase-functions';

export let newComment = https.onRequest(createComment);

export async function createComment(req: any, res: any){
    db.ref('comments').push(req.body.comment);
    res.send(req.body.comment);
}

che aspetto ha il tuo tsconfig? come posso compilare in una cartella dist e far sapere alle funzioni di gcloud dove si trova il mio index.js? Hai il tuo codice su github? :)
bersling

@ choopage-JekBao scusa è passato tanto tempo, non ho più il progetto. Se ricordo bene, puoi dare alla firebase config una directory (che è pubblica per impostazione predefinita). Potrei sbagliarmi, dato che è passato più di un anno
Ced

Hey @ced - perché il contenuto di non può db.tsandare all'interno main.ts(dopo l'istanza dell'amministratore?). O ti sei appena separato in questo modo per chiarezza / semplicità?
dsg38,

1
@ dsg38 questo è stato pubblicato troppo tempo fa, non vedo davvero perché dovrebbe essere in un file separato guardando la risposta ora .. Penso che fosse per chiarezza
Ced

21

Con Node 8 LTS ora disponibile con le funzioni Cloud / Firebase è possibile effettuare le seguenti operazioni con gli operatori di diffusione:

/package.json

"engines": {
  "node": "8"
},

/index.js

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

module.exports = {
  ...require("./lib/foo.js"),
  // ...require("./lib/bar.js") // add as many as you like
};

/lib/foo.js

const functions = require("firebase-functions");
const admin = require("firebase-admin");

exports.fooHandler = functions.database
  .ref("/food/{id}")
  .onCreate((snap, context) => {
    let id = context.params["id"];

    return admin
      .database()
      .ref(`/bar/${id}`)
      .set(true);
  });

Mi chiedo se il crescente numero di importazioni rallenta l'avvio a freddo di ciascuna funzione o se ci dovrebbero essere molti moduli totalmente separati sviluppati separatamente?
Simon Fakir,

2
ottengo un errore di partizione eslint unexpected token ...all'interno di index.js.
Thomas,

Forse non stai usando il Nodo 8
Luke Pighetti il

@SimonFakir bella domanda. Hai trovato qualcosa al riguardo?
atereshkov,

@atereshkov Sì, ho trovato un modo per caricare solo la funzione richiesta, comprese le sue dipendenze utilizzando "process.env.FUNCTION_NAME" simile alla risposta di seguito. Posso anche condividere il mio repository come riferimento se sei interessato a contattarmi.
Simon Fakir,

16

Per essere semplice (ma funziona), ho strutturato personalmente il mio codice in questo modo.

disposizione

├── /src/                      
   ├── index.ts               
   ├── foo.ts           
   ├── bar.ts
|   ├── db.ts           
└── package.json  

foo.ts

import * as functions from 'firebase-functions';
export const fooFunction = functions.database()......... {
    //do your function.
}

export const someOtherFunction = functions.database().......... {
    // do the thing.
}

bar.ts

import * as functions from 'firebase-functions';
export const barFunction = functions.database()......... {
    //do your function.
}

export const anotherFunction = functions.database().......... {
    // do the thing.
}

db.ts

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';

export const firestore = admin.firestore();
export const realtimeDb = admin.database();

index.ts

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';

admin.initializeApp(functions.config().firebase);
// above codes only needed if you use firebase admin

export * from './foo';
export * from './bar';

Funziona per le directory di qualsiasi livello nidificato. Segui semplicemente lo schema all'interno delle directory.

credito alla risposta @zaidfazil


1
Questa è una delle risposte più semplici per Typescript, grazie. Come affrontare una singola istanza del database Firebase, ad esempio? admin.initializeApp(functions.config().firestore) const db = admin.firestore();Dove lo metti e come ti riferisci ad esso in foo and bar?
elprl

Ehi - perché il contenuto di non può db.tsandare dentro index.ts(dopo l'istanza dell'amministratore?). O ti sei appena separato in questo modo per chiarezza / semplicità?
dsg38,

1
@ dsg38 puoi mescolare tutti insieme, questo chiarisce
Reza

Ho fatto qualcosa di simile per TS grazie a questa è una soluzione semplice e buona
Ruben

10

Nel caso con Babel / Flow sarebbe simile a questo:

Layout della directory

.
├── /build/                     # Compiled output for Node.js 6.x
├── /src/                       # Application source files
   ├── db.js                   # Cloud SQL client for Postgres
   ├── index.js                # Main export(s)
   ├── someFuncA.js            # Function A
   ├── someFuncA.test.js       # Function A unit tests
   ├── someFuncB.js            # Function B
   ├── someFuncB.test.js       # Function B unit tests
   └── store.js                # Firebase Firestore client
├── .babelrc                    # Babel configuration
├── firebase.json               # Firebase configuration
└── package.json                # List of project dependencies and NPM scripts


src/index.js - Esportazione / i principale / i

export * from './someFuncA.js';
export * from './someFuncB.js';


src/db.js - Cloud SQL Client per Postgres

import { Pool } from 'pg';
import { config } from 'firebase-functions';

export default new Pool({
  max: 1,
  user: '<username>',
  database: '<database>',
  password: config().db.password,
  host: `/cloudsql/${process.env.GCP_PROJECT}:<region>:<instance>`,
});


src/store.js - Client Firebase Firestore

import firebase from 'firebase-admin';
import { config } from 'firebase-functions';

firebase.initializeApp(config().firebase);

export default firebase.firestore();


src/someFuncA.js - Funzione A

import { https } from 'firebase-functions';
import db from './db';

export const someFuncA = https.onRequest(async (req, res) => {
  const { rows: regions } = await db.query(`
    SELECT * FROM regions WHERE country_code = $1
  `, ['US']);
  res.send(regions);
});


src/someFuncB.js - Funzione B

import { https } from 'firebase-functions';
import store from './store';

export const someFuncB = https.onRequest(async (req, res) => {
  const { docs: regions } = await store
    .collection('regions')
    .where('countryCode', '==', 'US')
    .get();
  res.send(regions);
});


.babelrc

{
  "presets": [["env", { "targets": { "node": "6.11" } }]],
}


firebase.json

{
  "functions": {
    "source": ".",
    "ignore": [
      "**/node_modules/**"
    ]
  }
}


package.json

{
  "name": "functions",
  "verson": "0.0.0",
  "private": true,
  "main": "build/index.js",
  "dependencies": {
    "firebase-admin": "^5.9.0",
    "firebase-functions": "^0.8.1",
    "pg": "^7.4.1"
  },
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.0",
    "babel-jest": "^22.2.2",
    "babel-preset-env": "^1.6.1",
    "jest": "^22.2.2"
  },
  "scripts": {
    "test": "jest --env=node",
    "predeploy": "rm -rf ./build && babel --out-dir ./build src",
    "deploy": "firebase deploy --only functions"
  }
}


$ yarn install                  # Install project dependencies
$ yarn test                     # Run unit tests
$ yarn deploy                   # Deploy to Firebase

9

Il profilo di bigcodenerd.org è un modello di architettura più semplice per avere metodi separati in file diversi ed esportati in una riga all'interno del file index.js .

L'architettura per il progetto in questo esempio è la seguente:

projectDirectory

  • index.js
  • podcast.js
  • profile.js

index.js

const admin = require('firebase-admin');
const podcast = require('./podcast');
const profile = require('./profile');
admin.initializeApp();

exports.getPodcast = podcast.getPodcast();
exports.removeProfile = profile.removeProfile();

podcast.js

const functions = require('firebase-functions');

exports.getPodcast = () => functions.https.onCall(async (data, context) => {
      ...
      return { ... }
  });

Lo stesso modello verrebbe utilizzato per il removeProfilemetodo nel file di profilo .


7

Per essere semplice (ma funziona), ho strutturato personalmente il mio codice in questo modo.

disposizione

├── /src/                      
   ├── index.ts               
   ├── foo.ts           
   ├── bar.ts           
└── package.json  

foo.ts

export const fooFunction = functions.database()......... {
    //do your function.
}

export const someOtherFunction = functions.database().......... {
    // do the thing.
}

bar.ts

export const barFunction = functions.database()......... {
    //do your function.
}

export const anotherFunction = functions.database().......... {
    // do the thing.
}

index.ts

import * as fooFunctions from './foo';
import * as barFunctions from './bar';

module.exports = {
    ...fooFunctions,
    ...barFunctions,
};

Funziona per le directory di qualsiasi livello nidificato. Segui semplicemente lo schema all'interno delle directory.


Non riesco a vedere come potrebbe funzionare, dato che Firebase supporta attualmente il Nodo 6.11 che non supporta le direttive di importazione ES6?
Aodh,

Se stai usando il dattiloscritto, il problema non dovrebbe mai sorgere. Recentemente ho portato la maggior parte del mio codice in dattiloscritto.
zaidfazil,

2
zaidfazil, dovresti probabilmente annotare tutti i prerequisiti nella tua risposta. @Aodh, funziona se usi Babel nello stesso modo in cui Konstantin ha delineato una risposta. stackoverflow.com/questions/43486278/...
PostureOfLearning

1
grazie. questo ha funzionato con dattiloscritto e nodo 6 :)
Ahmad Moussa,

4
Invece di importare e riesportare con operatori di spread, non potresti semplicemente avere export * from './fooFunctions';e export * from './barFunctions';in index.ts?
successo il

5

Questo formato consente al punto di ingresso di trovare file di funzione aggiuntivi ed esportare automaticamente ciascuna funzione all'interno di ciascun file.

Script del punto di ingresso principale

Trova tutti i file .js all'interno della cartella delle funzioni ed esporta ciascuna funzione esportata da ciascun file.

const fs = require('fs');
const path = require('path');

// Folder where all your individual Cloud Functions files are located.
const FUNCTIONS_FOLDER = './scFunctions';

fs.readdirSync(path.resolve(__dirname, FUNCTIONS_FOLDER)).forEach(file => { // list files in the folder.
  if(file.endsWith('.js')) {
    const fileBaseName = file.slice(0, -3); // Remove the '.js' extension
    const thisFunction = require(`${FUNCTIONS_FOLDER}/${fileBaseName}`);
    for(var i in thisFunction) {
        exports[i] = thisFunction[i];
    }
  }
});

Esempio di esportazione di più funzioni da un unico file

const functions = require('firebase-functions');

const query = functions.https.onRequest((req, res) => {
    let query = req.query.q;

    res.send({
        "You Searched For": query
    });
});

const searchTest = functions.https.onRequest((req, res) => {
    res.send({
        "searchTest": "Hi There!"
    });
});

module.exports = {
    query,
    searchTest
}

Gli endpoint accessibili http sono opportunamente denominati

✔ functions: query: http://localhost:5001/PROJECT-NAME/us-central1/query
✔ functions: helloWorlds: http://localhost:5001/PROJECT-NAME/us-central1/helloWorlds
✔ functions: searchTest: http://localhost:5001/PROJECT-NAME/us-central1/searchTest

Un file

Se hai solo alcuni file aggiuntivi (ad esempio solo uno), puoi utilizzare:

const your_functions = require('./path_to_your_functions');

for (var i in your_functions) {
  exports[i] = your_functions[i];
}


Questo non avrà un sovraccarico all'avvio per ogni istanza di funzione che gira su?
Ayyappa,

4

Quindi ho questo progetto che ha funzioni in background e funzioni http. Ho anche dei test per i test unitari. CI / CD semplificheranno la vita durante l'implementazione di funzioni cloud

Struttura delle cartelle

|-- package.json
|-- cloudbuild.yaml
|-- functions
    |-- index.js
    |-- background
    |   |-- onCreate
    |       |-- index.js
            |-- create.js
    |
    |-- http
    |   |-- stripe
    |       |-- index.js
    |       |-- payment.js
    |-- utils
        |-- firebaseHelpers.js
    |-- test
        |-- ...
    |-- package.json

Nota: la utils/ cartella è per il codice di condivisione tra le funzioni

funzioni / index.js

Qui puoi semplicemente importare tutte le funzioni di cui hai bisogno e dichiararle. Non c'è bisogno di avere la logica qui. Lo rende più pulito secondo me.

require('module-alias/register');
const functions = require('firebase-functions');

const onCreate = require('@background/onCreate');
const onDelete = require('@background/onDelete');
const onUpdate = require('@background/onUpdate');

const tours  = require('@http/tours');
const stripe = require('@http/stripe');

const docPath = 'tours/{tourId}';

module.exports.onCreate = functions.firestore.document(docPath).onCreate(onCreate);
module.exports.onDelete = functions.firestore.document(docPath).onDelete(onDelete);
module.exports.onUpdate = functions.firestore.document(docPath).onUpdate(onUpdate);

module.exports.tours  = functions.https.onRequest(tours);
module.exports.stripe = functions.https.onRequest(stripe);

CI / CD

Che ne dici di avere un'integrazione e una distribuzione continue ogni volta che invii le modifiche al repository? Puoi averlo usando google google cloud build . È gratuito fino a un certo punto :) Controlla questo link .

./cloudbuild.yaml

steps:
  - name: "gcr.io/cloud-builders/npm"
    args: ["run", "install:functions"]
  - name: "gcr.io/cloud-builders/npm"
    args: ["test"]
  - name: "gcr.io/${PROJECT_ID}/firebase"
    args:
      [
        "deploy",
        "--only",
        "functions",
        "-P",
        "${PROJECT_ID}",
        "--token",
        "${_FIREBASE_TOKEN}"
      ]

substitutions:
    _FIREBASE_TOKEN: nothing

ho esportato come hai detto ma la distribuzione firebase rileva quella che è alla fine, es: secondo il tuo codice ci vuole solo module.exports.stripe = function.https.onRequest (stripe);
OK200

@ OK200 qual è il comando che stai usando con la riga di comando di firebase? Per aiutarti, dovrò vedere un po 'di codice
ajorquera

3

C'è un modo abbastanza buono per organizzare tutte le funzioni del cloud a lungo termine. L'ho fatto di recente e funziona perfettamente.

Quello che ho fatto è stato organizzare ogni funzione cloud in cartelle separate in base al loro endpoint di trigger. Ogni nome file della funzione cloud termina con *.f.js. Ad esempio, se avevi onCreatee si onUpdateinnesca, user/{userId}/document/{documentId}crea due file onCreate.f.jse onUpdate.f.jsnella directory functions/user/document/e la tua funzione verrà denominata userDocumentOnCreateeuserDocumentOnUpdate rispettivamente. (1)

Ecco una struttura di directory di esempio:

functions/
|----package.json
|----index.js
/----user/
|-------onCreate.f.js
|-------onWrite.f.js
/-------document/
|------------onCreate.f.js
|------------onUpdate.f.js
/----books/
|-------onCreate.f.js
|-------onUpdate.f.js
|-------onDelete.f.js

Funzione di esempio

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const db = admin.database();
const documentsOnCreate = functions.database
    .ref('user/{userId}/document/{documentId}')
    .onCreate((snap, context) => {
        // your code goes here
    });
exports = module.exports = documentsOnCreate;

Index.js

const glob = require("glob");
const camelCase = require('camelcase');
const admin = require('firebase-admin');
const serviceAccount = require('./path/to/ServiceAccountKey.json');
try {
    admin.initializeApp({ credential: admin.credential.cert(serviceAccount),
    databaseURL: "Your database URL" });
} catch (e) {
    console.log(e);
}

const files = glob.sync('./**/*.f.js', { cwd: __dirname });
for (let f = 0, fl = files.length; f < fl; f++) {
    const file = files[f];
    const functionName = camelCase(file.slice(0, -5).split('/')); 
    if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === functionName) {
        exports[functionName] = require(file);
      }
}

(1): è possibile utilizzare qualsiasi nome desiderato. Per me, onCreate.f.js, onUpdate.f.js ecc. Sembrano più rilevanti per il tipo di trigger che sono.


1
Questo approccio è davvero carino. Mi chiedevo se è possibile regolare per consentire le barre nei nomi delle funzioni in modo da poter separare diverse versioni di api, ad esempio (api v1, api v2, ecc.)
Alex Sorokoletov,

Perché dovresti voler mantenere diverse versioni di una funzione cloud nello stesso progetto? Sebbene sia possibile farlo modificando leggermente la struttura della directory, per impostazione predefinita index.js distribuirà tutte le funzioni cloud a meno che non si esegua una distribuzione selettiva o si utilizzino if-condition in index.js che finiranno per ingombrare il codice
krhitesh

1
Sto bene con la distribuzione di tutto, voglio solo versioni delle funzioni che ho messo (attivate da http)
Alex Sorokoletov,

Mi aspetto che ogni trigger http sia nel proprio *.f.jsfile. Il minimo che puoi fare è rinominare il file per ogni versione anteponendo il suffisso per renderlo simile *.v1.f.jso *.v2.f.jsecc. (Supponendo che tutte le versioni di tutti i tuoi trigger http siano attive). Per favore fatemi sapere se avete una soluzione migliore.
Kritesh,

1

Uso un bootloader JS vanilla per includere automaticamente tutte le funzioni che voglio usare.

├── /functions
   ├── /test/
      ├── testA.js
      └── testB.js
   ├── index.js
   └── package.json

index.js (bootloader)

/**
 * The bootloader reads all directories (single level, NOT recursively)
 * to include all known functions.
 */
const functions = require('firebase-functions');
const fs = require('fs')
const path = require('path')

fs.readdirSync(process.cwd()).forEach(location => {
  if (!location.startsWith('.')) {
    location = path.resolve(location)

    if (fs.statSync(location).isDirectory() && path.dirname(location).toLowerCase() !== 'node_modules') {
      fs.readdirSync(location).forEach(filepath => {
        filepath = path.join(location, filepath)

        if (fs.statSync(filepath).isFile() && path.extname(filepath).toLowerCase() === '.js') {
          Object.assign(exports, require(filepath))
        }
      })
    }
  }
})

Questo file index.js di esempio include solo automaticamente le directory all'interno della radice. Potrebbe essere espanso per camminare nelle directory, onorare .gitignore, ecc. Per me è stato abbastanza.

Con il file indice in atto, l'aggiunta di nuove funzioni è banale.

/test/testA.js

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello from Firebase!");
});

/test/testB.js

const functions = require('firebase-functions');

exports.helloWorld2 = functions.https.onRequest((request, response) => {
 response.send("Hello again, from Firebase!");
});

npm run serve rendimenti:

λ ~/Workspace/Ventures/Author.io/Firebase/functions/ npm run serve

> functions@ serve /Users/cbutler/Workspace/Ventures/Author.io/Firebase/functions
> firebase serve --only functions


=== Serving from '/Users/cbutler/Workspace/Ventures/Author.io/Firebase'...

i  functions: Preparing to emulate functions.
Warning: You're using Node.js v9.3.0 but Google Cloud Functions only supports v6.11.5.
✔  functions: helloWorld: http://localhost:5000/authorio-ecorventures/us-central1/helloWorld
✔  functions: helloWorld2: http://localhost:5000/authorio-ecorventures/us-central1/helloWorld2

Questo flusso di lavoro è praticamente solo "scrivi ed esegui", senza dover modificare il file index.js ogni volta che una nuova funzione / file viene aggiunta / modificata / rimossa.


non sarà questo con partenza a freddo?
Ayyappa,

1

Ecco una risposta semplice se stai creando funzioni cloud con dattiloscritto.

/functions
|--index.ts
|--foo.ts

Vicino a tutte le tue normali importazioni in alto, esporta semplicemente tutte le funzioni foo.ts.

export * from './foo';


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.