nodejs node new example aws await async lambda firebase amazon

node - Amazon Lambda a Firebase



aws lambda publish new version (7)

Resolví mi problema usando firebase REST api

var https = require(''https''); exports.handler = function(event, context, callback) { var body = JSON.stringify({ foo: "bar" }) var https = require(''https''); var options = { host: ''project-XXXXX.firebaseio.com'', port: 443, path: ''/.json'', method: ''POST'' }; var req = https.request(options, function(res) { console.log(res.statusCode); res.on(''data'', function(d) { process.stdout.write(d); }); }); req.end(body); req.on(''error'', function(e) { console.error(e); }); callback(null, "some success message"); }

Obtengo ''No se puede encontrar el módulo'' firebase ''cuando intento ejecutar esto en Lambda (Node.js 4.3)

var Firebase = require(''firebase'');

Lo mismo ocurre cuando intento cargar un paquete comprimido que incluye node_modules / firebase

¿Alguien tiene una implementación de ''escribir de lambda a firebase''?


Esto es tarde, pero en caso de que alguien más esté buscando:

Comprimir la carpeta del proyecto en lugar del contenido de la carpeta del proyecto puede causar esto. La carpeta comprimida, cuando se extrae, no debe contener una carpeta con los archivos lambda, pero debe tener el archivo index.js y la carpeta node_modules en el nivel raíz.

Un ejemplo de funcionamiento de una función lambda es (usando las últimas cosas brillantes de la base de fuego * suspiro *):

var firebase = require(''firebase''); // Your service account details var credentials = { "type": "service_account", "project_id": "project-123451234512345123", "private_key_id": "my1private2key3id", "private_key": "-----BEGIN PRIVATE KEY-----InsertKeyHere-----END PRIVATE KEY-----/n", "client_email": "[email protected]", "client_id": "1111222223333344444", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/projectname%40project-123451234512345123.iam.gserviceaccount.com" }; firebase.initializeApp({ serviceAccount: credentials, databaseURL: "https://project-123451234512345123.firebaseio.com" }); exports.handler = function (event, context, callback) { // I use some data passed in from AWS API Gateway: if (!event.firebaseUid) { callback(''Missing param for id''); } firebase.database().ref().child(''users'').child(firebaseUid).child(''at'').set(newTokens.access_token).then(function (data) { console.log(''Firebase data: '', data); firebase.database().goOffline(); callback(null, ''Firebase data: '', data); }).catch(function (error) { callback(''Database set error '' + error); }); };

Ahora para la advertencia. He experimentado esto haciendo que la función lambda se agote, incluso después de que se haya realizado la devolución de llamada de firebase, es decir. la función set parece crear un oyente que mantiene abierta la función lambda a pesar del retorno de los datos correctos.

Actualización: Llamar a firebase.database (). GoOffline () soluciona el problema de tiempo de espera de la función Lambda que estaba experimentando.

Las advertencias habituales sobre la seguridad no se verifican o son apropiadas, y se aplican las posibilidades de detener el espacio y el tiempo mediante el uso de esta.


Para usar de forma segura el paquete firebase npm (versión 3.3.0) en AWS Lambda (Nodejs 4.3), haga lo siguiente:

''use strict''; var firebase = require("firebase"); exports.handler = (event, context, callback) => { context.callbackWaitsForEmptyEventLoop = false; //<---Important var config = { apiKey: "<<apikey>>", authDomain: "<<app_id>>.firebaseapp.com", databaseURL: "https://<<app_id>>.firebaseio.com", storageBucket: "<<app_id>>.appspot.com", }; if(firebase.apps.length == 0) { // <---Important!!! In lambda, it will cause double initialization. firebase.initializeApp(config); } ... <Your Logic here...> ... };


Otra alternativa si está utilizando una configuración de desarrollo basada en nodos es usar el paquete node-lambda desde aquí . Básicamente, proporciona envoltorios para configurar, probar e implementar en lambda. node-lambda deploy empaquetará todos los módulos que hayas instalado (por ejemplo, con npm i --save firebase ) y se asegurará de que estén disponibles en Lambda. Lo encontré realmente útil para administrar módulos externos.


Para mí, firebase-admin debería hacer el truco. https://firebase.google.com/docs/admin/setup

Gracias por Josiah Choi por sugerir context.callbackWaitsForEmptyEventLoop embargo. Entonces lambda no necesita inicializar Firebase cada vez. Mi primera carrera fue muy lenta.

var firebase = require(''firebase-admin''); module.exports.Test = (event, context, callback) => { context.callbackWaitsForEmptyEventLoop = false; //<---Important if(firebase.apps.length == 0) { // <---Important!!! In lambda, it will cause double initialization. firebase.initializeApp({ credential: firebase.credential.cert("serviceAccount.json"), databaseURL: <YOUR FIREBASE URL> }); } firebase.database().ref(''conversation'').once(''value'').then(function(snapshot) { console.log (snapshot.val()) ; var bodyReturn = { input: snapshot.val() } ; callback(null,bodyReturn); context.succeed() ; }); };


Después de intentar algunas cosas, esto parece funcionar para mí (v 3.10.8):

for(var i=0;i<5;i++) { var firebase = require(''firebase''); var config = { apiKey: "", authDomain: "", databaseURL: "", storageBucket: "", messagingSenderId: "" }; if(firebase.apps) if(firebase.apps.length==0) firebase.initializeApp(config) firebase.database().ref().child("test").once(''value''). then(function(snapshot) { console.log(snapshot.val()); }); }


2017-03-22 editar: Google acaba de anunciar las funciones de la nube de Firebase , que es una forma mucho mejor de hacerlo. Las funciones de la nube funcionan igual que lambda y pueden activarse desde eventos de firebase.

Aquí está mi solución usando la API REST (para que no necesites require nada):

var https = require(''https''); var firebaseHost = "yourapp.firebaseio.com"; function fbGet(key){ return new Promise((resolve, reject) => { var options = { hostname: firebaseHost, port: 443, path: key + ".json", method: ''GET'' }; var req = https.request(options, function (res) { res.setEncoding(''utf8''); var body = ''''; res.on(''data'', function(chunk) { body += chunk; }); res.on(''end'', function() { resolve(JSON.parse(body)) }); }); req.end(); req.on(''error'', reject); }); } function fbPut(key, value){ return new Promise((resolve, reject) => { var options = { hostname: firebaseHost, port: 443, path: key + ".json", method: ''PUT'' }; var req = https.request(options, function (res) { console.log("request made") res.setEncoding(''utf8''); var body = ''''; res.on(''data'', function(chunk) { body += chunk; }); res.on(''end'', function() { resolve(body) }); }); req.end(JSON.stringify(value)); req.on(''error'', reject); }); }

Puedes usarlo así:

fbPut("/foo/bar", "lol").then(res => { console.log("wrote data") })

Y entonces:

fbGet("/foo/bar").then(data => { console.log(data); // prints "lol" }).catch(e => { console.log("error saving to firebase: "); console.log(e); })