¿Cómo servir archivos estáticos en Express?
Tags: node, express, javascript
Published: 2021-05-03 04:02:51

En este pequeño articulo aprenderás como servir archivos estáticos en Express.

Express es framework de Node Js el cual nos permite crear API's y servicios web robustos de una manera más fácil.

Si tenemos nuestra API desarrollada con Express sera muy fácil agregarle la capacidad de que pueda manejar los archivos estáticos.

Llámese archivos estáticos a imágenes, videos, archivos de audio, documentos en distintos formatos, fuentes, archivos de JavaScript, html y css, etc.

##Iniciemos





##1. Configuración de Express

Primero vamos a crear un proyecto para de Node para este ejemplo, en este caso voy a inicializar todos los valores predeterminados utilizando la bandera "-y", esto configurará un archivo package.json para manejar las dependencias.

```properties
npm init -y
```


Ahora creamos un archivo de entrada con el nombre index.js, aquí es donde crearemos el servidor de Express.


Bien, ahora instalemos express como dependencia de nuestro proyecto

```properties
npm install express
```


En nuestro package.json agreguemos un comando que nos permitirá iniciar el servidor que crearemos en breve.

```properties
  "start": "node index.js"
```

El package.json deberá verse así

```javascript
{
  "name": "express-static-files",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node index.js"
  },
  "keywords": [],
  "author": "Ricardo Chavarria",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}
```

##2. Carpeta de archivos estáticos

Para almacenar los archivos estáticos, creemos una carpeta llamada "public" en la raíz de nuestro proyecto, y podemos agregar algunos archivos en mi caso colocare una imagen y un archivo html.

La estructura de archivos se vera así:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmefj2x42mnu6yfwe71p.png)


##Creación del servidor con Express 

En el index.js, vamos requerir express y hacemos una instancia del mismo, luego implementamos una solicitud get y finalmente levantamos nuestro servidor para que funcione en el puerto 3000.


```javascript
const express = require('express');
 
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
    res.send('Hello World!');
});


app.listen(PORT, () =>
  console.log(`Server listening on port: ${PORT}`),
);
```


Ejecutamos "npm run start" en la terminal y veremos el siguiente mensaje.


```properties
Server listening on port: 3000
```


Y sí accedemos en nuestro navegador a http://localhost:3000/ debemos de ver el mensaje de 'Hello World!' que implementamos en la solicitud get. 


Bien hecho, ya tenemos nuestro servidor de Express configurado correctamente, solo queda agregarle la capacidad a nuestro servidor de que pueda manejar archivos estáticos.


##3. Sirviendo Archivos Estáticos


Utilizaremos el módulo path de Node Js, este modulo contiene todas las utilidades para trabajar con rutas de archivos. No necesitamos instalar nada, solo es necesario requerirlo en nuestro archivo index.js


```javascript
const path = require('path');
```

Ahora sí, con la siguiente linea de código le decimos a express que pueda servir archivos estáticos.



```javascript
app.use('/public', express.static(path.join(__dirname, 'public')))
```


Cuando usamos app.use(), le estamos diciendo a Express que use un Middleware, el Middleware básicamente es un bloque de código o función que se ejecuta entre la petición que hace el usuario hasta que la petición llega al servidor, funciona como una especie de proxy.

express.static() busca  y devuelve los archivos estáticos solicitados por el usuario y recibe como parámetro la ruta del folder donde están esos archivos.

Utilizamos el modulo path para proporcionar una ruta absoluta de la carpeta, ya que se colocas la ruta directamente estarías proporcionando una ruta relativa y si ejecutas la aplicación desde otro directorio o similar puedes tener problemas, por ello se recomienda utilizar la ruta absoluta y módulo path nos ayuda con eso.


El index.js se veria así:

```javascript
const express = require('express');
const path = require('path');
 
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
    res.send('Hello World!');
});


app.use('/public', express.static(path.join(__dirname, 'public')))

app.listen(PORT, () =>
  console.log(`Server listening on port: ${PORT}`),
);
```


##4. Probando la aplicación

Creemos un archivo index.html en la carpeta public, agreguemos lo siguiente:


```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Archivos Estáticos</title>
</head>
<body>
    <h1>Sirviendo archivos estáticos en Express</h1>
</body>
</html>
```

Ahora ejecutemos 

```properties
npm start
```


Vayamos a http://localhost:3000/public/

Deberíamos de ver lo siguiente:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gmanvytcnufvts1dci2a.png)


También podemos servir imágenes 

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ekfzcsqm7zzo6eob4xyj.png)
 
Con esto hemos finalizado.

El repositorio de este tutorial lo puedes encontrar [aquí](https://github.com/ricardochl/express-static-files)

Déjame saber en los comentarios que te pareció este tutorial.

Gracias por leer está publicación.