# 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)


---

# 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.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.
