---
title: 'Creación de Proyecto con Loopback'
disqus: hackmd
---
LoopBack 4
===
[Referencia](https://loopback.io/doc/en/lb4/)
[Modules](https://github.com/strongloop/loopback)
---
LoopBack es un galardonado framework Node.js y TypeScript de código abierto, altamente extensible y basado en Express. Permite crear rápidamente API y microservicios compuestos a partir de sistemas backend como bases de datos y servicios SOAP o REST.
Loopback se compone de:
* Una biblioteca de módulos Node.js.
* Generadores Yeoman para aplicaciones.
* SDK de cliente para iOS, Android y clientes web.
Herramienta de linea de comandos
* loopback-cli : `lb4`
## Contenido
[TOC]
## Prerrequisito
1. Nodej.js, versión 14 o superior
Intalacion del CLI del lookback
---
```shell
npm i -g @loopback/cli@2.21.1
```
>
## Módulos

Creación de la aplicación
---
Para la creación del proyect nos apoyamos en el CLI del loopback
El comando utilizado es el siguiente:
```shell
lb4 app --applicationName=ejemplo --docker --private
```
> --applicationName : utilizado para configurar de la clase principal de la aplicación
> --docker : utilizado para la generacion del archivo Dockerfile
> --private : utlizado para marcar el proyecto como privado

En este imagen se puede visualizar la salida del comando lb4 y nos permite habilitar reglas a utilizar en el proyecto. En este punto seleccionamos la primera opción
`(*) Habilitar eslint` y luego oprimimos la tecla **enter** habilitando todas las reglas para el proyecto.
El proyecto tendrá la siguiente estructura
```shell
public/
index.html
src/
__tests__/
README.md
acceptance/
home-page.acceptance.ts
ping.controller.acceptance.ts
test-helper.ts
controllers/
index.ts
README.md
ping.controller.ts
datasources/
README.md
models/
README.md
repositories/
README.md
application.ts
index.ts
migrate.ts
sequence.ts
node_modules/
***
LICENSE
Dockerfile
README.md
package.json
tsconfig.json
.eslintrc.js
.prettierrc
.mocharc.json
```
Flujo de interacción entre capas
---
```sequence
Controller->Service: obtención de listado
Note right of Service: identificacion de recurso
Service-->Datasource: solicitud de recurso
Datasource->Service: retorna listado de recurso solicitado
Note left of REST Service: datasource-juggler
Datasource->REST Service: HttpRequest
```
## Creación de Modelo
Un modelo describe objetos del dominio empresarial y define una lista de propiedades con nombre, tipo y otras restricciones.
Para la representación de los modelos se puede utilizar clases especificas o interfaces.
Para la creación del model es necesario estar dentro del directorio raiz del proyecto.
El comando utilizado para la generación del modelo es:
```shell=
lb4 model <nombre>
```
El comando te permite agregar propiedades, tipo y reglas por cada propiedad definida.

Tipos de modelos:
* Entity
* Un objeto de dominio que tiene una identidad (ID). Su igualdad se basa en la identidad. Por ejemplo, Cliente puede ser modelado como una Entity porque cada cliente tiene un único id de cliente. Dos instancias de Cliente con el mismo id de cliente son iguales ya que se refieren al mismo cliente. Por ejemplo, así es como se puede modelar un Cliente
```javascript=
import {Entity, model, property} from '@loopback/repository';
@model()
export class Customer extends Entity {
@property({id: true}) id: string;
@property() name: string;
@property() email: string;
constructor(data?: Partial<Appointment>) {
super(data);
}
}
```
* Model
* Objeto de dominio que no tiene identidad (ID). Su igualdad se basa en el valor estructural. Por ejemplo, Address puede modelarse como un Modelo porque dos direcciones. son iguales si tienen los mismos valores de número de calle, nombre de calle, ciudad y código postal. Por ejemplo, así es como se puede modelar una Dirección:
```javascript=
import {Model, model, property} from '@loopback/repository';
@model()
export class Address extends Model {
@property() streetNum: number;
@property() streetName: string;
@property() city: string;
@property() zipCode: string;
constructor(data?: Partial<Address>) {
super(data);
}
```
> Alternativamente se puede optar por la creación de una interfaz para el intercambio de datos o transformacion de los datos para envió del desde el bff al cliente, ejemplo:
```javascript=
export interface MensajeDetail {
codigo: number;
mensaje: string;
}
```
> *Observaciones: para la validación de estructura de datos es conveniente utilizar un modelo con clases y no una interfaz. Así el framework realizar el proceso de validación por nosotros*