Angular: quando você precisa ver o aplicativo, mas o back-end ainda não está pronto

Se você está envolvido no desenvolvimento de front-end, provavelmente conhece as seguintes mises-en-scenes: os termos do projeto estão diminuindo rapidamente, sua gerência ou o cliente, ou ambos, juntos querem ver com os olhos o aplicativo em funcionamento no momento, mesmo com dados falsos. Ao mesmo tempo, pode haver um fundo, mas é a camada de interação API com a frente que está faltando na palavra.

Então, recentemente, enfrentei uma situação dessas e estou desenvolvendo uma interface para angulares (pessoas sentadas em cadeiras levemente afagadas, alguém assentiu com compreensão).

Agora vou tentar a sério. Por um lado, a situação não é incomum e muitas soluções podem ser escolhidas.

Várias soluções vieram à mente:

  1. Dados no nível do componente do código fixo
  2. Codifique os dados no nível dos serviços do resolvedor, fixe-os nas rotas necessárias
  3. Dados codificados no nível do provedor de serviços de dados
  4. Api de liberação e, de acordo com os contratos acordados, retorna dados codificados

Mas qualquer uma dessas opções parecia uma muleta inesgotável, para cada uma das quais havia deficiências significativas.

  1. A primeira opção desapareceu imediatamente - uma solução não utilizada absolutamente inconveniente, à medida que o projeto se desenvolve, tudo terá que ser reescrito.
  2. Essa solução pode ocorrer, mas, novamente, a estrutura do projeto e a lógica dos componentes serão reescritas.
  3. Como opção possível, você pode até retornar dados de stub de forma assíncrona, simulando uma chamada de servidor, no entanto, como nas soluções anteriores para o problema, nossos interceptadores (se existirem, mas existem) ficarão sem trabalho e a simulação funcionará. com apoio fica incompleto.
  4. A última opção parecia bastante aceitável, sem os problemas das opções anteriores, mas eu não queria escrever código rígido no projeto de back-end simplesmente por razões de higiene.

Como resultado, outra opção foi escolhida: criar um servidor da Web separado, que retornaria dados de acordo com rotas e contratos, e definir uma configuração separada para a montagem e execução do angular. Acabou sendo fácil fazer as duas coisas.

Para implementar o servidor simulado, express foi selecionado.

Vamos começar com isso.

Selecionamos o local em que queremos escrever o código para o servidor msk, por exemplo, no diretório mock-server ao lado do projeto ng.

Em seguida, você precisa inicializar o projeto e adicionar o pacote com o express.

npm init 

 npm install --save express 

Em seguida, adicione um código que retornará dados para nós. Criamos o arquivo index.js, pegamos o código do primeiro 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 o servidor

 node index.js 

Verifique com o carteiro:



Tudo está super, o servidor está funcionando. Agora vamos configurar uma das rotas, como se estivéssemos solicitando dados de uma API real. Digamos que precisamos de uma lista de todos os livros, preencha o arquivo books.json com livros

 [ { "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" } ] 

E atualize o arquivo do aplicativo:

 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"); }); 

E verifique:



Ótimo.
Agora vamos começar com o aplicativo angular.
Adicione a configuração que armazena o endereço na parte traseira aos arquivos environment / 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/' } 

No modo normal, e no modo prod e em desenvolvimento, procuraremos a API do núcleo .net na porta 5000, conforme descrito acima. Em seguida, descrevemos a configuração para o retorno temporário
environment.mock.ts

 export const environment = { production: false, backend: 'http://localhost:3000/' } 

Aqui, como você pode ver, estamos procurando pela API na porta 3000, onde executaremos o Express.

Agora precisamos de um interceptador que direcione as chamadas de volta para o servidor correto, dependendo da configuração.

 @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; } } 

Resta definir a nova configuração para montar e iniciar o aplicativo para funcionar com o servidor simulado.

Para fazer isso, precisamos ajustar um pouco o angular.json.

Na seção do seu projeto, arquiteto / construção / configurações, inclua uma nova configuração de construção simulada e descreva a substituição dos arquivos de ambiente para essa configuração. Também para o modo de veiculação, crie uma configuração simulada e especifique a opção de compilação desejada

 { "$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" } } } }, /*****/ } } } 

Isso é tudo, agora resta executar o projeto na configuração desejada

 ng serve --configuration=mock 

e verifique para onde voam as chamadas para trás:



Tudo está ótimo.

De fato, esse design ainda nos ajudará bastante quando forçarmos a integração e os testes e2e ao projeto. Vou tentar escrever sobre isso em um futuro próximo.

Source: https://habr.com/ru/post/pt460109/


All Articles