# Configuración

Ahora vamos a instalar varias dependencias que harán nuestra configuración de Express.js más profesional para un futuro paso a producción

En la raíz de nuestro proyecto ejecutamos la siguiente linea:

```bash
# install dependencies
npm i -S compression body-parser method-override errorhandler
```

#### Compression

Cuando utilizamos ExpressJS para alojar nuestro servidor, hay una pequeña mejora de rendimiento que podemos hacer (funciona de forma universal en cualquier tipo de servidor: plantillas HTML a API REST de JSON para servidores de imágenes), que es para habilitar la compresión GZIP.

Con este middleware podremos obtener una compresión GZIP de forma muy fácil para nuestro servidor.

#### Body Parser

Usualmente el cuerpo de una petición (payload), contiene información desde una petición tipo POST cuando un cliente desea crear una nueva entidad/registro o actualizar uno existente mediante PUT. Los desarrolladores quienes implementan servidores, requieren frecuentemente accesar a la información del cuerpo de dicha petición.

El modulo npm `body-parser` nos permite realizar esta tarea. No es necesario programarla. Luego de instalar esta dependencia debemos habilitar `json()` así como `url-encode` como middlewares para convertir datos a JSON.

#### Method Override

Cuando intentamos usar PUT y DELETE en HTML, tenemos un problema. Los navegadores admiten PUT y DELETE, pero solo mediante la solicitud a través de AJAX, pero no a través del envío de 'formulario HTML. Este middleware nos ayudará a resolver esto.

#### Errorhandler

Este middleware solo debe utilizarse en un entorno de desarrollo, ya que los seguimientos de la pila de errores completos y los detalles internos de cualquier objeto pasado a este módulo se devolverán al cliente cuando se produzca un error. Cuando se proporciona un objeto a Express como un error, este módulo mostrará la mayor cantidad posible de este objeto, y lo hará mediante la negociación de contenido para la respuesta entre HTML, JSON y texto sin formato.

### Configurando Express.js

Luego de tener claro los middleware anteriores vamos agregarlos a nuestra configuración base de Express.js, para eso vamos a crear un archivo en `config/express.js`

{% code title="config/express.js" %}
```javascript
/**
 * Express configuration
 * @author: Cristian Moreno Zulauaga <khriztianmoreno@gmail.com>
 */

const compression = require('compression');
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const errorHandler = require('errorhandler');

module.exports = (app) => {
  const env = app.get('env');

  app.use(compression());
  app.use(bodyParser.urlencoded({ extended: false, limit: '50mb' }));
  app.use(bodyParser.json({ limit: '50mb' }));
  app.use(methodOverride());

  if (env === 'development' || env === 'test') {
    app.use(errorHandler()); // Error handler - has to be last
  }
};
```
{% endcode %}

### Actualizando app.js

Ahora vamos agregar nuestra configuración de Express.js a nuestra aplicación, vamos actualizar el archivo `app.js` con dos lineas:

{% code title="app.js" %}
```javascript
// Add this line
const expressConfig = require('./config/express');

// Add this line
expressConfig(app);
```
{% endcode %}

Finalmente nuestro archivo `app.js` debe quedar similar a este:

```javascript
const express = require('express');
const http = require('http');

// New line
const expressConfig = require('./config/express');

// Setup server
const app = express();
const server = http.createServer(app);

// New line
expressConfig(app);

const config = {
  port: 8080,
  ip: '127.0.0.1',
};

// Start server
function startServer() {
  app.shoppingCartBK = server.listen(config.port, config.ip, () => {
    console.log(`Express server listening on ${config.port}, in ${app.get('env')} mode`);
  });
}

setImmediate(startServer);

// Expose app
module.exports = app;
```

Después  de hacer esto recuerda hacer un nuevo commit.

#### Commit: [Add the express config](https://github.com/khriztianmoreno/workshop-js-dev-bk/commit/cd7f0ea687a27b3fd368b807e6623f132e427fb5)
