Las variables de entorno son tan solo variables que nuestra computadora puede almacenar. En producción el servidor tiene sus propias variables de entorno, entonces simplemente nuestra aplicación va a leer esas variables y utilizarlas. En esta última parte ya tenemos funcionando nuestra aplicación REST. Ahora para poder desplegar esta REST API en algún servicio tenemos que configurar las variables de entorno. Para poder hacer esto primero tenemos que ir al archivo db.js
dónde vamos a realizar una serie de configuraciones.
Para poder entender de qué se trata todo esto vamos a instalar el siguiente módulo.
En este archivo db.js
tenemos las credenciales para la conexión a nuestra base de datos, está bien si solamente estamos en modo de desarrollo, pero para producción no vamos a poder utilizarlo de esta misma manera.
Para poder tener un entorno preparado para producción, vamos a usar variables de entorno.
Ahora vamos a cancelar nuestro proceso presionando control + C. y vamos a instalar el módulo Dotenv utilizando el siguiente comando:
npm install dotenv
Este módulo dotenv
, permite leer un archivo con extensión .env
mismo que lo vamos a crear en la raíz de nuestro proyecto al mismo nivel del archivo package.json
y en este archivo vamos a poder definir nuestras variables de entorno. De esta forma no vamos a tener que exponerlas en nuestro código. Por ejemplo, en este archivo vamos a escribir una variable de entorno llamada.
PORT=3000
Leyendo variables de entorno
Esto es como utilizar una variable básica en JavaScript, donde le estamos dando un nombre y un valor. Solo es para el sistema, no es para nuestro proyecto, de esta forma tenemos una variable en nuestro computador y solamente la tenemos que leer. Para poder leerla tenemos que tener un archivo en la carpeta src
que se llame config.js
.
Desde este archivo, vamos a importar el módulo 'dotenv'
y lo vamos a ejecutar utilizando config()
y luego lo vamos a tener que exportar.
const {config} = require('dotenv')
config()
console.log(process.env.PORT)
module.exports = config
A partir de aquí ya podríamos estar leyendo variables de entorno, entonces vamos a hacer que muestre por consola a través del objeto process
de Node.js nuestra variable de entorno PORT
.
console.log(process.env.PORT)
Esta es la forma en la que podemos leer variables de entorno, porque process
es un objeto global de Node.js y env
almacena todas las variables que tenemos en nuestro computador y PORT
es la variable que queremos llamar.
Una vez que tenemos esto ya podemos importar nuestro archivo, para esto vamos a ir a nuestro archivo principal index.js
y vamos a utilizar la sintaxis require()
para requerir el archivo config.js
.
require('./config.js')
Ahora si vamos a la consola y ejecutamos nuestra aplicación con
mpm run dev
Podemos ver que antes de que se ejecute la línea 'Server is on port 3000'
, vemos un 3000 que eso lo estamos mostrando desde la variable de entorno que creamos con el valor de PORT
.
Definiendo el resto de las variables de entorno
Ahora algo importante saber es que para todos los archivos .env
, los valores almacenados son strings
. Así como estamos definiendo el PORT
vamos a definir el resto de los valores.
PORT=3000
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=
DB_DATABASE=companydb
Para leer estos valores vamos a ir a config.js
hacemos lo mismo, es decir, así como leímos, PORT
vamos a poder leer el resto de los valores:
console.log(process.env.DB_HOST)
console.log(process.env.DB_PORT)
console.log(process.env.DB_USER)
console.log(process.env.DB_PASSWORD)
console.log(process.env.DB_DATABASE)
A continuación los valores devueltos:
3000
localhost
3306
root
<===( Acá no nos muestra nada porque nuestra variable password está vacío)
companydb
Configurando variables de entorno para producción
Hasta el momento estamos recibiendo estos valores desde el archivo .env
, pero cuando estemos en producción, este archivo no va a existir, sino que dentro del propio entorno de la nube vamos a poder configurar estos valores.
En este caso estos valores no los quiero ver por consola sino que quiero utilizarlos.
Vamos a empezar a configurar el PORT
, para esto vamos a crear una constante llamada PORT
.
const PORT = process.env.PORT || 3000
Esta constante va a almacenar lo que viene de process.env.PORT
y si no existe utilice el valor 3000
. Esto lo vamos a exportar utilizando la sintaxis de, module.exports
vamos a crear un objeto de exportación.
module.exports = {
config,
PORT
}
Ahora vamos a ir al archivo index.js
para importar el valor PORT
utilizando la sintaxis de require()
y utilizando desestructuración de JavaScript para obtener el PORT
.
const {PORT} = require('./config.js')
Este objeto PORT
es el que se va a utilizar en lugar del puerto 3000
que habíamos tenido configurado previamente.
Esto es importante porque en producción no vamos a estar utilizando el puerto 3000
porque el servidor o servicio en la nube nos va a asignar un puerto.
app.listen(PORT)
Entonces, a través del método, listen()
le estamos diciendo que tome el puerto que está dando el servicio en la nube. Lo mismo aquí cambiamos el mensaje para que tome el puerto que nos está enviando el servicio a la nube.
console.log('Server is on port', PORT)
Ahora si nosotros guardamos y vamos a ver a la consola seguimos viendo que el puerto sigue siendo el 3000
, y si vamos al archivo .env
y cambiamos el puerto al 5000
y guardamos vamos a ver ahora que en la consola dice 'server on Port 5000'
.
Configurando el resto de los valores para la base de datos
Con esto ya tenemos configurado el puerto y con esta misma idea también vamos a configurar nuestra base de datos.
const PORT = process.env.PORT || 5000
const DB_HOST = process.env.DB_HOST || 'root'
const DB_PORT = process.env.DB_PORT || 3306
const DB_USER = process.env.DB_USER || 'root'
const DB_PASSWORD = process.env.DB_PASSWORD || ''
const DB_DATABASE = process.env.DB_DATABASE || 'companydb'
module.exports = {
config,
PORT,
DB_HOST,
DB_PORT,
DB_USER,
DB_PASSWORD,
DB_DATABASE
}
Cuidado de no confundir PORT
con DB_PORT
, ya que PORT
es el puerto del servidor y DB_PORT
es el puerto de la base de datos.
Ahora lo que vamos a hacer es guardar y vamos a importar estas variables en db.js
desde el archivo config.js
utilizando desestructuración de JavaScript:
const { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE} = require('./config.js')
Y después le pasamos los datos a nuestra conexión
const pool = mysql.createPool({
host: DB_HOST,
user: DB_USER,
password: DB_PASSWORD,
port: DB_PORT,
database: DB_DATABASE
})
Esto nos va a servir para desplegar nuestra aplicación en cualquier servicio en la nube. Para comprobar que todo esté funcionando correctamente, vamos a ir a nuestro navegador y visitamos la ruta /ping
que sabemos que nos tiene que dar nuestro resultado pong
.
Reorganizando el código del archivo index.js
De esta forma ya tenemos configurada nuestras variables de entorno, para terminar esta sección, podríamos hacer una mejora que sería colocar el index.js
en otro lugar.
Porque si en algún momento vamos a empezar a tener más módulos o ampliar la funcionalidad de nuestra aplicación, no es una buena idea tener todo en un mismo archivo.
Para esto lo que podemos crear un archivo aparte llamado app.js
dentro de la carpeta src
y vamos a cortar todo este código que está en index.js y lo vamos a pegar dentro de app.js
.
const express = require('express')
const app = express()
const employeesRoutes = require("./routes/employees.routes.js")
const indexRoutes = require("./routes/index.routes.js")
const {PORT} = require('./config.js')
app.use(express.json())
app.use(indexRoutes)
app.use('/api', employeesRoutes)
app.use((req, res, next) =>{
res.status(404).json({
message: 'Ruta NO encontrada'
})
})
Como acá ya tenemos configurado la constante app
tenemos que exportarla, para eso utilizamos la sintaxis module.exports
module.exports = app
Ahora vamos a ir a index.js
y le vamos a decir que importe app
desde app.js
, también en index.js
vamos a necesitar el PORT, entonces tenemos que importar los dos archivos.
const {PORT} = require('./config.js')
const app = require('./app.js')
Y el index.js
finalmente quedaría así:
const {PORT} = require('./config.js')
const app = require('./app.js')
app.listen(PORT)
console.log('Server is on port', PORT)
Ahora guardamos y nos vamos al navegador y vamos a refrescar la ruta /ping
, para asegurarnos de que nuestra aplicación siga funcionando como hasta ahora.
De esta forma tenemos una aplicación mucho más ordenada. El archivo index.js
es el que arranca todo, de esta forma llama a app.js
, y app.js
llama a las rutas, este tiene todas las configuraciones de Express. De esta forma es como se va a inicializar nuestra aplicación.