الزاوي: عندما تحتاج إلى رؤية التطبيق ، إلا أن الواجهة الخلفية ليست جاهزة بعد

إذا كنت منخرطًا في تطوير الواجهة الأمامية ، فمن المحتمل أن تكون mise-en-scene التالية مألوفة بالنسبة لك: الشروط في المشروع تتقلص بسرعة ، أو إدارتك ، أو العميل ، أو كلاهما ، تريد معا أن ترى بأعينهم تطبيق العمل في الوقت الحالي ، حتى مع وجود بيانات مزيفة. في الوقت نفسه ، قد يكون هناك ظهر ، ولكن طبقة التفاعل api مع الجبهة هي المفقودة من الكلمة على الإطلاق.

لذلك ، واجهت مؤخرًا مثل هذا الموقف ، وأنا أقوم بتطوير واجهة للزاوية (الأشخاص الذين يجلسون على الكراسي يجلسون برفاهية ، ويومئ أحدهم برأسه بطريقة مفهومة).

الآن سأحاول ذلك بجدية. من ناحية ، فإن الوضع ليس شائعًا ، ويمكن اختيار العديد من الحلول.

عدة حلول تتبادر إلى الذهن:

  1. Hardcode مستوى مكون البيانات
  2. بيانات Hardcode على مستوى خدمات محلل البيانات ، قم بتثبيتها على الطرق الضرورية
  3. بيانات Hardcode على مستوى موفر خدمة البيانات
  4. تدفق api ، ووفقًا للعقود المتفق عليها ، يُرجع البيانات المضغوطة

ولكن يبدو أن أيًا من هذه الخيارات هو عكاز لا ينضب ، وكان لكل منها عيوب كبيرة.

  1. اختفى الخيار الأول فورًا - وهو حل غير مستخدَم على الإطلاق غير مريح ، مع تطور المشروع ، يجب إعادة كتابة كل شيء.
  2. يمكن أن يحدث هذا الحل ، ولكن مرة أخرى ، سيتم إعادة كتابة بنية المشروع ومنطق المكونات.
  3. أحد الخيارات المحتملة ، يمكنك حتى إعادة بيانات كعب الروتين بشكل غير متزامن ، مع محاكاة مكالمة الخادم ، ومع ذلك ، كما هو الحال في الحلول السابقة للمشكلة ، فإن أدوات الاعتراض لدينا (إذا كانت موجودة ، ولكنها موجودة) ستكون عاطلة ، واتضح أن تقليد العمل مع دعم يصبح غير مكتمل.
  4. بدا الخيار الأخير مقبولًا تمامًا ، خالٍ من المشكلات التي واجهتها الخيارات السابقة ، لكنني لا أريد أن أكتب hardode في مشروع الواجهة الخلفية ببساطة لأسباب صحية.

نتيجة لذلك ، تم اختيار خيار آخر: رفع خادم ويب منفصل ، والذي سيعود البيانات وفقًا للطرق والعقود ، وتكوين تكوين منفصل للتجميع وتنفيذ الزاوي. اتضح أنه من السهل القيام بالأمرين معا.

لتنفيذ خادم وهمية ، تم اختيار اكسبريس .

لنبدأ به.

نختار المكان الذي نريد أن نكتب فيه رمزًا لخادم msk ، على سبيل المثال ، في دليل خادم الصور المجاور لمشروع ng.

بعد ذلك ، تحتاج إلى تهيئة المشروع وإضافة الحزمة مع صريح.

npm init 

 npm install --save express 

بعد ذلك ، أضف رمزًا سيعيد البيانات إلينا. نقوم بإنشاء ملف index.js ، ونأخذ الكود من البرنامج التعليمي الأول.

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

بدء الخادم

 node index.js 

تحقق مع ساعي البريد:



كل شيء رائع ، الخادم يعمل. الآن ، دعونا نقوم بتكوين أحد المسارات ، كما لو أننا نطلب بيانات من api حقيقي. لنفترض أننا بحاجة إلى قائمة بجميع الكتب ، املأ ملف books.json بالكتب

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

وتحديث ملف التطبيق:

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

وتحقق:



ممتاز.
الآن لنبدأ مع التطبيق الزاوي.
أضف التكوين الذي يخزن العنوان إلى الخلف إلى ملفات البيئات / البيئة * .ts.
environment.ts:

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

environment.prod.ts

 export const environment = { production: true, backend: 'http://localhost:5000/' } 

في الوضع العادي ، وفي prod وفي وضع التطوير ، سوف نبحث عن .net core api على المنفذ 5000 ، كما هو موضح أعلاه. بعد ذلك ، نصف التكوين للظهر المؤقت
environment.mock.ts

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

هنا ، كما ترون ، نحن نبحث عن api على المنفذ 3000 ، حيث سنقوم بالتشغيل السريع.

نحتاج الآن إلى أداة اعتراض ستوجه المكالمات إلى الخلف إلى الخادم الصحيح ، اعتمادًا على التكوين.

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

يبقى تكوين التكوين الجديد لتجميع وتشغيل التطبيق للعمل مع خادم وهمية.

للقيام بذلك ، نحن بحاجة إلى قرص angular.json قليلا.

في قسم مشروعك ، يقوم المعماري / build / configurations ، بإضافة تكوين بناء وهمية جديد ، ووصف استبدال ملفات البيئة لهذا التكوين. أيضًا بالنسبة لوضع العرض ، قم بإنشاء تكوين وهمي وحدد خيار الإنشاء المرغوب

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

هذا كل شيء ، والآن يبقى لتشغيل المشروع في التكوين المطلوب

 ng serve --configuration=mock 

وتحقق من مكالمات العودة إلى الخارج:



كل شيء رائع.

في الواقع ، سيظل هذا التصميم يساعدنا كثيرًا عندما نقوم بتشديد التكامل واختبارات e2e للمشروع. سأحاول أن أكتب عن هذا في المستقبل القريب.

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


All Articles