BACKEND FAKE SERVER
Contoh Backend Palsu untuk Pengembangan Tanpa Backend
Backend palsu digunakan untuk melakukan pengembangan backendless di Angular yang memungkinkan Anda mendemonstrasikan kode Anda tanpa perlu membuat api server backend, ini sempurna untuk kode yang dihosting di StackBlitz yang tidak memiliki backend, atau ketika Anda sedang mengembangkan ujung depan sebelum backend tersedia.
Saya membuat backend palsu di bawah ini sebagai bagian dari Pendaftaran Pengguna Angular 9 dan Contoh & Tutorial Login, itu dibangun dengan memperluas antarmuka Angular HttpInterceptor dan menyertakan titik akhir tiruan untuk otentikasi dan manajemen pengguna, dan menggunakan penyimpanan lokal browser untuk menyimpan data sehingga dapat berperilaku seperti api nyata termasuk persistensi data.
Melewati permintaan yang tidak dibuat-buat ke API backend yang sebenarnya
Terkadang ada kebutuhan untuk melewati permintaan khusus ke server alih-alih ditangkap oleh backend palsu, misalnya ketika backend asli sebagian selesai dan memiliki beberapa titik akhir yang tersedia.
Dengan pencegat HTTP Angular 9 ini dilakukan dengan memanggil return next.handle(request);, Anda dapat melihat kode untuk melewati permintaan di bagian bawah contoh kode di bawah ini.
Penyedia Backend Palsu 9 Sudut
import { Injectable } from '@angular/core';
import { HttpRequest, HttpResponse, HttpHandler, HttpEvent, HttpInterceptor, HTTP_INTERCEPTORS } from '@angular/common/http';
import { Observable, of, throwError } from 'rxjs';
import { delay, mergeMap, materialize, dematerialize } from 'rxjs/operators';
// array in local storage for registered users
let users = JSON.parse(localStorage.getItem('users')) || [];
@Injectable()
export class FakeBackendInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const { url, method, headers, body } = request;
// wrap in delayed observable to simulate server api call
return of(null)
.pipe(mergeMap(handleRoute))
.pipe(materialize()) // call materialize and dematerialize to ensure delay even if an error is thrown (https://github.com/Reactive-Extensions/RxJS/issues/648)
.pipe(delay(500))
.pipe(dematerialize());
function handleRoute() {
switch (true) {
case url.endsWith('/users/authenticate') && method === 'POST':
return authenticate();
case url.endsWith('/users/register') && method === 'POST':
return register();
case url.endsWith('/users') && method === 'GET':
return getUsers();
case url.match(/\/users\/\d+$/) && method === 'GET':
return getUserById();
case url.match(/\/users\/\d+$/) && method === 'PUT':
return updateUser();
case url.match(/\/users\/\d+$/) && method === 'DELETE':
return deleteUser();
default:
// pass through any requests not handled above
return next.handle(request);
}
}
// route functions
function authenticate() {
const { username, password } = body;
const user = users.find(x => x.username === username && x.password === password);
if (!user) return error('Username or password is incorrect');
return ok({
id: user.id,
username: user.username,
firstName: user.firstName,
lastName: user.lastName,
token: 'fake-jwt-token'
})
}
function register() {
const user = body
if (users.find(x => x.username === user.username)) {
return error('Username "' + user.username + '" is already taken')
}
user.id = users.length ? Math.max(...users.map(x => x.id)) + 1 : 1;
users.push(user);
localStorage.setItem('users', JSON.stringify(users));
return ok();
}
function getUsers() {
if (!isLoggedIn()) return unauthorized();
return ok(users);
}
function getUserById() {
if (!isLoggedIn()) return unauthorized();
const user = users.find(x => x.id === idFromUrl());
return ok(user);
}
function updateUser() {
if (!isLoggedIn()) return unauthorized();
let params = body;
let user = users.find(x => x.id === idFromUrl());
// only update password if entered
if (!params.password) {
delete params.password;
}
// update and save user
Object.assign(user, params);
localStorage.setItem('users', JSON.stringify(users));
return ok();
}
function deleteUser() {
if (!isLoggedIn()) return unauthorized();
users = users.filter(x => x.id !== idFromUrl());
localStorage.setItem('users', JSON.stringify(users));
return ok();
}
// helper functions
function ok(body?) {
return of(new HttpResponse({ status: 200, body }))
}
function error(message) {
return throwError({ error: { message } });
}
function unauthorized() {
return throwError({ status: 401, error: { message: 'Unauthorised' } });
}
function isLoggedIn() {
return headers.get('Authorization') === 'Bearer fake-jwt-token';
}
function idFromUrl() {
const urlParts = url.split('/');
return parseInt(urlParts[urlParts.length - 1]);
}
}
}
export const fakeBackendProvider = {
// use fake backend in place of Http service for backend-less development
provide: HTTP_INTERCEPTORS,
useClass: FakeBackendInterceptor,
multi: true
};
Menghubungkan Backend Palsu ke Aplikasi Angular 9 Anda
Untuk menambahkan penyedia backend palsu ke aplikasi Angular 9 Anda, Anda perlu mengimpor fakeBackendProvider di modul aplikasi Anda seperti yang ditunjukkan di bawah ini, dan menambahkan fakeBackendProvider ke daftar penyedia di modul aplikasi Anda.
Di bawah ini adalah kode modul aplikasi lengkap untuk contoh di mana backend palsu digunakan, tutorial lengkap tersedia di sini.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
// used to create fake backend
import { fakeBackendProvider } from './_helpers';
import { AppRoutingModule } from './app-routing.module';
import { JwtInterceptor, ErrorInterceptor } from './_helpers';
import { AppComponent } from './app.component';
import { AlertComponent } from './_components';
import { HomeComponent } from './home';
@NgModule({
imports: [
BrowserModule,
ReactiveFormsModule,
HttpClientModule,
AppRoutingModule
],
declarations: [
AppComponent,
AlertComponent,
HomeComponent
],
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
// provider used to create fake backend
fakeBackendProvider
],
bootstrap: [AppComponent]
})
export class AppModule { };
Komentar
Posting Komentar