Crear una REST API usando Express.js con funciones en la nube de Firebase (Cloud Functions)


Cloud Functions para Firebase es un framework sin servidores que te permite ejecutar de forma automática el código de backend en respuesta a las solicitudes HTTPS.

Tu código JavaScript o TypeScript se almacena en la nube de Google y se ejecuta en un entorno administrado.

Primero debemos crear nuestro proyecto en Firebase si no sabes como puedes visitar el link que te dejo a continuación:

Tendrás que configurar una base de datos para ello vamos a nuestra consola de Firebase a la sección de Cloud Firestore

Luego al momento de crear la base de datos seleccionaremos empezar en modo de prueba

Finalmente tendrás que seleccionar la ubicación de la base de datos y habilitarla.

Listo ahora realizaremos las configuraciones en nuestro proyecto con Express

Configurar proyecto Express.js

Para empezar vamos a crear nuestro proyecto agregarnos un directorio con el nombre que elijas para tu propósito, en mi caso será restapi-express-firebase.

Vamos a instalar lo necesario para configurar Firebase en nuestro proyecto se hará una instalación de forma general con el parámetro -g ya que tenemos que conectarnos a los servicios de Firebase, ejecutamos el siguiente comando

npm install -g firebase-tools

Ahora ya podemos usar los comando de Firebase en nuestra consola lo que haremos para empezar es autenticarnos, mediante nuestras credenciales de la cuenta de Google.

firebase login

Se abrirá en tu navegador tu cuenta de Google y debes permitirle que acceda a tus información para Firebase, finalmente te saldrá una pantalla como esta:

Y en tu consola veras lo siguiente

Ejecutamos el comando para inicializar el proyecto de firebase

firebase init

En la consola seleccionamos Functions ya que es el modulo que vamos a usar de Firebase, lo seleccionas con la tecla espacio y le das enter.

Te hara las siguientes preguntas

? Please select an option: (Use arrow keys)

Seleccionas Use an existing project le das enter para continuar

? What language would you like to use to write Cloud Functions?

Seleccionas JavaScript le das enter para continuar

El sistema de firebase hara todo lo que ves a continuacion

Perfecto ya tenemos configurado nuestro proyecto vemos una estructura de carpetas que se ha creado luego del proceso con Firebase

Podemos ver que se han agregado dos dependencias al archivo package.json llamadas «firebase-admin» y «firebase-functions». Las funciones de Firebase nos permiten activar funciones en la nube basadas en Cloud Firestore, Real-Time Database, Firebase Authentication, Google Analytics, etc.

Tenemos que agregar las dependencias necesarias, accedemos a la carpeta functions y ejecutamos los comandos necesarios para crear nuestro servidor express, y agregar los métodos cors a para el acceso de origen cruzado.

npm install express --save
npm install cors --save

Listo ahora nuestro archivo index.js quedara de la siguiente manera

const functions = require("firebase-functions");
const admin = require('firebase-admin');
const express = require('express');
const cors = require('cors')

admin.initializeApp(functions.config().firebase);

const app = express();
app.use(cors());

app.get('/users', (req, res) => { });

app.post('/users', (req, res) => { });

app.put('/users/:id', (req, res) => { });

app.delete('/users/:id', (req, res) => { });

const api = functions.https.onRequest(app)
module.exports = { api }

Ya tenemos todo listo para agregar las operaciones CRUD

Creación del CRUD

Método POST: Creación de usuarios

Creara una colección usuarios, y un nuevo documento ya que Firebase Cloud Firestore es una base de datos NoSQL.

app.post('/users', async (req, res) => {
    try {
        const user = await db.collection('users').add(req.body);
        res.status(201).send('Created a new user: ' + user.id);
    } catch (error) {
        res.status(400).send(error);
    }
});

Método GET: Obtener usuarios

Obtiene todos los documentos de la colección users.

app.get('/users', async (req, res) => {
    try {
        const userQuerySnapshot = await db.collection('users').get();
        const users = [];
        userQuerySnapshot.forEach(
            (doc) => {
                users.push({
                    id: doc.id,
                    data: doc.data()
                });
            }
        );
        res.status(200).json(users);
    } catch (error) {
        res.status(400).send(error);
    }
});

Método PUT: Actualizar usuarios por ID

Le envías un id del documento para actualizar su información

app.put('/users/:id', async (req, res) => {
    await db.collection('users').doc(req.params.id).set(req.body, { merge: true })
        .then(() => res.json({ id: req.params.userId }))
        .catch((error) => res.status(500).send(error))
});

Método DELETE: Eliminación de usuarios por ID

Mediante un id eliminaras el documento de la colección.

app.delete('/users/:id', (req, res) => {
    db.collection('users').doc(req.params.userId).delete()
        .then(() => res.status(204).send("Document successfully deleted!"))
        .catch(function (error) {
            res.status(500).send(error);
        });
});

Subir REST API (Deploy)

Si revisas tu package.json podras ver que ya tienes configurados unos scripts pero en este tutorial vamos a usar uno en especifico.

El deploy que en al momento de correrlo en consola ejecutara firebase deploy –only functions eso quiere decir que solo subira los servicios.

"scripts": {
    "serve": "firebase emulators:start --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  }

Entonces vamos a ejecutar el comando:

npm run deploy

Veras algo parecido a lo siguiente luego de ejecutar el comando.

Si vamos a nuestra consola de Firebase y nos dirigimos a Functions y veremos nuestro servicio activo

Ahora podemos crear muchos mas servicios dependiendo de las necesidades que tengamos y esto nos abre la puerta a los microservicios.

Puedes encontrar el código fuente de este tutorial en GitHub

Probamos nuestra api con Postman si no sabes que es mira el siguiente enlace:

Deja un comentario