# 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
 */

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.

#### Repositorio: [Add the express config](https://github.com/colombia-dev/medjs-workshop-fullstack-js-backend/commit/b39a32236d0413b082a2e7607d5f3efc8c34b099)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://medellin-js.gitbook.io/workshop-fullstack-js-developer/backend/express-js/configuracion.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
