Si est谩 involucrado en el desarrollo de frontend, entonces probablemente conozca las siguientes puestas en escena: los t茅rminos del proyecto se est谩n reduciendo r谩pidamente, su gerencia o el cliente, o ambos, juntos quieren ver con sus ojos la aplicaci贸n que funciona en este momento, incluso con datos falsos. Al mismo tiempo, puede haber un reverso, pero es la capa de interacci贸n API con el frente lo que falta en la palabra.
Entonces, recientemente me enfrent茅 a una situaci贸n as铆, y estoy desarrollando una interfaz para angular (la gente sentada en las sillas le dio unas palmaditas lentas, alguien asinti贸 con comprensi贸n).
Ahora lo intentar茅 en serio. Por un lado, la situaci贸n no es infrecuente y se pueden elegir muchas soluciones.
Se me ocurrieron varias soluciones:
- Datos de nivel de componente de c贸digo duro
- Datos de c贸digo duro a nivel de servicios de resoluci贸n, anclarlos a las rutas necesarias
- Datos de c贸digo duro a nivel del proveedor de servicios de datos
- Enjuague la API y, de acuerdo con los contratos acordados, devuelva datos codificados
Pero cualquiera de estas opciones parec铆a una muleta inagotable, para cada una de las cuales hab铆a importantes deficiencias.
- La primera opci贸n desapareci贸 de inmediato: una soluci贸n no utilizada absolutamente inconveniente, a medida que se desarrolla el proyecto, todo tendr谩 que reescribirse.
- Esta soluci贸n podr铆a tener lugar, pero nuevamente, se reescribir谩 la estructura del proyecto y la l贸gica de los componentes.
- Una opci贸n posible, incluso puede devolver datos de c贸digo auxiliar de forma asincr贸nica, simulando una llamada al servidor, sin embargo, como en soluciones anteriores al problema, nuestros interceptores (si existen, pero existen) estar铆an sin trabajo, y resulta que la imitaci贸n del trabajo con respaldo se vuelve incompleto.
- La 煤ltima opci贸n parec铆a bastante aceptable, sin los problemas que ten铆an las opciones anteriores, pero no quer铆a escribir c贸digo duro en el proyecto de back-end simplemente por razones de higiene.
Como resultado, se eligi贸 otra opci贸n: crear un servidor web separado, que devolver铆a datos de acuerdo con rutas y contratos, y configurar una configuraci贸n separada para el ensamblaje y la ejecuci贸n de angular. Result贸 ser f谩cil hacer ambas cosas.
Para implementar el servidor simulado, se seleccion贸
express .
Comencemos con eso.
Seleccionamos el lugar donde queremos escribir el c贸digo para el servidor msk, por ejemplo, en el directorio del servidor simulado al lado del proyecto ng.
A continuaci贸n, debe inicializar el proyecto y agregar el paquete con express.
npm init
npm install --save express
Luego, agregue un c贸digo que nos devuelva datos. Creamos el archivo index.js, tomamos el c贸digo del primer tutorial.
const express = require("express"); const app = express(); app.get("/url", (req, res, next) => { res.json(["Tony", "Lisa", "Michael", "Ginger", "Food"]); }); app.listen(3000, () => { console.log("Server running on port 3000"); });
Iniciar el servidor
node index.js
Consulte con el cartero:

Todo est谩 super, el servidor est谩 funcionando. Ahora configuremos una de las rutas, como si estuvi茅ramos solicitando datos de una API real. Digamos que necesitamos una lista de todos los libros, llene el archivo books.json con libros
[ { "rn": 0, "id": "0", "name": "Jungle", "type": 0, "wells": 10042, "default": false, "hidden": false, "author": "Admin" }, { "rn": 1, "id": "1", "name": "Main", "type": 1, "wells": 156, "default": true, "hidden": false, "author": "User" } ]
Y actualice el archivo de la aplicaci贸n:
const express = require("express"); const app = express(); app.get("/api/book/", (req, res, next) => { const books = require('./books'); res.json(books); }); app.listen(3000, () => { console.log("Server running on port 3000"); });
Y verifica:

Genial
Ahora comencemos con la aplicaci贸n angular.
Agregue la configuraci贸n que almacena la direcci贸n al reverso a los archivos de entornos / environment * .ts.
environment.ts:
export const environment = { production: false, backend: 'http://localhost:5000/' }
environment.prod.ts
export const environment = { production: true, backend: 'http://localhost:5000/' }
En modo normal, y en prod y en modo de desarrollo, buscaremos .net core api en el puerto 5000, como se describi贸 anteriormente. A continuaci贸n, describimos la configuraci贸n para el regreso temporal
environment.mock.ts
export const environment = { production: false, backend: 'http://localhost:3000/' }
Aqu铆, como puede ver, estamos buscando una API en el puerto 3000, donde ejecutaremos express.
Ahora necesitamos un interceptor que dirija las llamadas al servidor correcto, dependiendo de la configuraci贸n.
@Injectable() export class RequestInterceptor implements HttpInterceptor { baseUrl: string; constructor() { this.baseUrl = environment.backend; } intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(this.modifyRequest(req)); } private modifyRequest = (req: HttpRequest<any>): HttpRequest<any> => { if (req.url.startsWith('api/')) { const url = this.baseUrl; req = req.clone({ url: url + req.url }); } return req; } }
Queda por configurar la nueva configuraci贸n para ensamblar e iniciar la aplicaci贸n para que funcione con el servidor simulado.
Para esto necesitamos ajustar angular.json un poco.
En la secci贸n de su proyecto, arquitecto / compilaci贸n / configuraciones, agregue una nueva configuraci贸n de compilaci贸n simulada y describa el reemplazo de los archivos de entorno para esta configuraci贸n. Tambi茅n para el modo de servicio, cree una configuraci贸n simulada y especifique la opci贸n de compilaci贸n deseada
{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "your-project": { /*****/ "architect": { "build": { /*****/ "configurations": { "production": { /*****/ }, "mock": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.mock.ts" } ] } } }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { "browserTarget": "your-project:build" }, "configurations": { "production": { "browserTarget": "your-project:build:production" }, "mock": { "browserTarget": "your-project:build:mock" } } } }, /*****/ } } }
Eso es todo, ahora queda ejecutar el proyecto en la configuraci贸n deseada
ng serve --configuration=mock
y verifique d贸nde vuelan las llamadas a la parte posterior:

Todo es genial
De hecho, este dise帽o todav铆a nos ayudar谩 mucho cuando ajustemos la integraci贸n y las pruebas e2e al proyecto. Intentar茅 escribir sobre esto en un futuro cercano.