> For the complete documentation index, see [llms.txt](https://medellin-js.gitbook.io/workshop-fullstack-js-developer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://medellin-js.gitbook.io/workshop-fullstack-js-developer/backend/express-js.md).

# Express.js

![Express.js](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-Lgyno4NC7rhy49BAEjN%2F-Lh14lb3LH4C886qWxYA%2F-Lh1DZeIUQennGd9RiHe%2FScreen%20Shot%202019-06-10%20at%2011.30.20%20AM.png?alt=media\&token=784b79f6-81b5-4308-97a2-155afb9d496f)

Express es un marco de aplicación web Node.js mínimo y flexible que proporciona un conjunto robusto de características para aplicaciones web.

Con una gran cantidad de métodos de utilidad HTTP y middleware a su disposición, crear una API robusta es rápido y fácil.

El primer paso para implementar un sitio web moderno es la construcción de un API REST que podemos consumir desde una aplicación web, mobile o nativa.

Una API RESTful es aquella que emplea todos los verbos HTTP (GET, POST, PUT y DELETE mayormente) Como ejemplo para este tutorial, desarrollaré una aplicación [**CRUD** (Create/Read/Update/Delete)](http://en.wikipedia.org/wiki/Create,_read,_update_and_delete) que utiliza todos los verbos HTTP, para mostrar cómo trabaja. Vamos allá!

### Middleware <a href="#middleware" id="middleware"></a>

Middleware es una función que sigue convenciones específicas. En este proyecto utilizaremos varios middlewares propios y otros más instalados como dependencias.

### Estructura del proyecto <a href="#estructura-del-proyecto" id="estructura-del-proyecto"></a>

Antes de comenzar a instalar las dependencias necesarias para nuestro proyecto quiero mostrar cómo sera la estructura de este proyecto para que te familiarices y puedas entender mejor este taller.

Cada aplicación necesita ajustes de configuración y la mayoría de los lenguajes de programación / ecosistemas tiene algún tipo de soporte y convención por defecto para él.

* La mayoría de las aplicaciones Java se basan en archivos .properties;
* .Net tiene sus archivos estándar app.config y web.config;
* Ruby on Rails carga la configuración desde config/application.rb, Initializers and After-initializers;
* Node.js no tiene una forma estándar de administrar estos ajustes, pero hay muchas opciones disponibles.

Esta será la estructura base de nuestro proyecto, esta se denomina **Folder-by-feature**

```
backend-js-shopping
├── api
│    ├── helloWorld
│    │    ├── helloWorld.controller.js
│    │    └── index.js
│    ├── product
│    │    ├── product.controller.js
│    │    ├── product.model.js
│    │    └── index.js
│    └── user
│         ├── user.controller.js
│         ├── user.model.js
│         └── index.js
├── auth
│    ├── facebook
│    ├── google
│    ├── local
│    │    ├── passport.js
│    │    └── index.js
│    ├── auth.service.js
│    └── index.js
├── config
│    ├── environment
│    │    ├── development.js
│    │    ├── production.js
│    │    ├── shared.js
│    │    └── index.js
│    ├── express.js
│    └── local.env.js
├── app.js  
├── routes.js   
└── index.js
```

### Instalar Express.js <a href="#instalar-express-js" id="instalar-express-js"></a>

Ahora instale Express en el directorio `backend-js-shopping` y guárdelo en la lista de dependencias.

```bash
npm i -S express
```

Esto nos dará la partida para comenzar a desarrollar nuestro proyecto de Node.js con Express.js para crear la API de todo nuestro proyecto de carrito de compras.

### Servidor con Express.js <a href="#servidor-con-express-js" id="servidor-con-express-js"></a>

Basados en la estructura de carpetas anterior, vamos a crear un nuevo archivo llamado `app.js` en toda la raíz del proyecto. Este archivo contendrá el siguiente código:app.js

{% code title="app.js" %}

```javascript
/**
 * Main application file
 */

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

// Setup server
const app = express();
const server = http.createServer(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;


```

{% endcode %}

Por último para esta primera parte sobre Express.js vamos a crear un nuevo archivo llamado `index.js` y este será la entrada del proyecto.index.js

{% code title="index.js" %}

```javascript
/**
 * Export the application
 */
module.exports = require('./app');
```

{% endcode %}

#### Ejecutar servidor <a href="#ejecutar-servidor" id="ejecutar-servidor"></a>

Con la configuración anterior ya podemos lanzar nuestra aplicación, solo debemos correr en la terminal:

```bash
# RUN index file
node index.js

# Output >>> Express server listening on 8080, in development mode
```

En la siguiente sección veremos cómo iniciar a configurar Express.js de una forma más profesional.

### Repositorio: [Code Base](https://github.com/colombia-dev/medjs-workshop-fullstack-js-backend/commit/3e1e37f84dd0c57226c4ed7470ce5703ae22cc76)
