Een blog-app maken met Angular & MongoDB voeg bericht toe

In het vorige deel van de serie Angular blog-tutorials, heb je geleerd hoe je de ShowPostComponent om de lijst met blogberichten op de startpagina weer te geven. U hebt de records opgehaald die zijn ingevoegd vanuit de MongoDB-shell met behulp van het gemaakte REST API-eindpunt.

In deze zelfstudie maakt u een nieuw onderdeel met de naam AddPostComponent om de gebruikersinterface te bieden om een ​​nieuwe blogpost toe te voegen aan de MongoDB-database.

Ermee beginnen

Laten we beginnen door de broncode uit het vorige deel van de zelfstudiegroep te klonen.

git clone https://github.com/royagasthyan/ShowPost AddPost

Navigeer naar de projectdirectory en installeer de vereiste afhankelijkheden.

cd AddPost / client npm install cd AddPost / server npm install

Nadat de afhankelijkheden zijn geïnstalleerd, start u de client- en servertoepassing opnieuw op.

cd AddPost / client npm start cd AddPost / server node app.js

Richt uw browser op http: // localhost: 4200 en u zou de applicatie moeten laten draaien.

Het toevoegen van berichtcomponent maken

Laten we beginnen door het maken van de AddPostComponent. Maak een map met de naam add-bericht binnen in de src / app map. Binnen in de add-bericht map, maak een bestand aan met de naam add-post.component.ts en voeg de volgende code toe:

Component importeren vanuit '@ angular / core'; importeer Post van '... /models/post.model'; @Component (selector: 'app-add-post', templateUrl: './add-post.component.html', styleUrls: ['./add-post.component.css']) exportklasse AddPostComponent constructor ()  

Maak een bestand met de naam add-post.component.html en de volgende HTML-code:

Je zult de add post component als een popup laten zien.

Nu moet je het toevoegen AddPostComponent naar de NgModule. Importeer de AddPostComponent in de app.module.ts het dossier.

import AddPostComponent uit './add-post/add-post.component';

Voeg het component toe aan de NgModule declaraties lijst. Hier is hoe het eruit ziet:

import BrowserModule vanuit '@ angular / platform-browser'; import NgModule uit '@ angular / core'; importeer ROUTING van './app.routing'; importeer FormsModule vanuit '@ angular / forms'; importeer HttpClientModule van '@ angular / common / http'; importeer RootComponent van './root/root.component'; importeer LoginComponent van './login/login.component'; importeer HomeComponent uit './home/home.component'; import ShowPostComponent vanuit './show-post/show-post.component'; import AddPostComponent uit './add-post/add-post.component'; @ NgModule (verklaringen: [RootComponent, LoginComponent, HomeComponent, ShowPostComponent, AddPostComponent], invoer: [BrowserModule, ROUTING, FormsModule, HttpClientModule], providers: [], bootstrap: [RootComponent]) exportklasse AppModule  

Om de popup voor het toevoegen van berichten te activeren, hebt u de data-target attribuut aan de knop in home.component.html.

Sla de bovenstaande wijzigingen op en start de toepassing opnieuw. Log in op de applicatie en klik op de Toevoegen link op de startpagina. Je hebt de AddPostComponent weergegeven als een popup.

Implementatie van de functie Postfunctionaliteit toevoegen

Voeg de toe ngModel richtlijn voor de invoerelementen voor titel en Omschrijving.

 

Voeg een ... toe Klik richtlijn naar de knop voor het aanroepen van de methode om het blogbericht op te slaan.

Importeer de Post model van src / app / modellen / post.model.ts in de add-post.component.ts het dossier.

importeer Post van '... /models/post.model';

Definieer de post variabele in de add-post.component.ts het dossier.

openbare post: bericht;

Definieer de addPost methode binnen de add-post.component.ts het dossier. Van de addPost methode, valideert u de ingevoerde titel en Omschrijving en maak een aanroep van de servicemethode om de REST API aan te roepen. Hier ziet u hoe de methode eruitziet:

addPost () if (this.post.title && this.post.description) // bel de servicemethode om post else alert ('Titel en omschrijving vereist') toe te voegen; 

Laten we het servicebestand voor de component maken AddPostComponent. Maak een bestand met de naam add-post.service.ts en voeg de volgende code toe:

Injectable importeren vanuit '@ angular / core'; importeer HttpClient van '@ angular / common / http'; importeer Post van '... /models/post.model'; @Injectable () exportklasse AddPostService constructor (privé http: HttpClient) 

Binnen in de AddPostService, maak een methode genaamd addPost om de REST API-aanroep te doen.

addPost (plaatsen: plaatsen) retourneer this.http.post ('/ api / post / createPost', title: post.title, description: post.description)

Zoals te zien in de bovenstaande code, hebt u gebruik gemaakt van de HttpClient om de API aanroep te doen en de waarneembaar.

In de add-post.component.ts bestand in de addPost methode, abonneer je je op de addPost methode van de add-post.service.ts het dossier.

this.addPostService.addPost (this.post) .subscribe (res => // antwoord van REST API call);

Hier is hoe het add-post.component.ts bestand ziet er:

Component importeren vanuit '@ angular / core'; import AddPostService van './add-post.service'; importeer Post van '... /models/post.model'; @Component (selector: 'app-add-post', templateUrl: './add-post.component.html', styleUrls: ['./add-post.component.css'], providers: [AddPostService] ) exportklasse AddPostComponent openbare post: bericht; constructor (private addPostService: AddPostService) this.post = new Post ();  addPost () if (this.post.title && this.post.description) this.addPostService.addPost (this.post) .subscribe (res => console.log ('response is', res)) ;  else alert ('Titel en omschrijving vereist');  

De REST API maken voor Add Post

Laten we een REST API-eindpunt maken voor het toevoegen van de blogpost aan de MongoDB-database. In de server / app.js bestand, maak een API-eindpunt zoals getoond:

app.post ('/ api / post / createPost', (req, res) => // voeg de details toe aan MongoDB)

Eerst moet u verbinding maken met de MongoDB-database met behulp van de Mangoest cliënt.

mongoose.connect (url, useMongoClient: true, function (err) if (err) gooi err; console.log ('connection established'););

Nadat de verbinding tot stand is gebracht, moet u een modelobject maken met behulp van de Post schema gedefinieerd in de server / model / post.js het dossier. 

const post = new Post (title: req.body.title, description: req.body.description)

Zoals te zien in de bovenstaande code, hebt u het object Post gemaakt met behulp van de titel en Omschrijving geslaagd voor het verzoek req voorwerp.

Bel de opslaan methode op het object Post om het item op MongoDB op te slaan.

post.save ((err, doc) => if (err) gooi err; return res.status (200) .json (status: 'success', data: doc))

Zoals te zien in de bovenstaande code, eenmaal de opslaan methode callback wordt aangeroepen zonder fout, het geeft de. terug succes bericht samen met het geretourneerde object dokter.

Hier ziet u hoe het REST API-eindpunt er uiteindelijk uitziet:

app.post ('/ api / post / createPost', (req, res) => mongoose.connect (url, useMongoClient: true, function (err) if (err) gooi fout; const post = nieuwe bericht (title: req.body.title, description: req.body.description) post.save ((err, doc) => if (err) gooi err; return res.status (200) .json (status : 'success', data: doc)));)

Sla de bovenstaande wijzigingen op en start beide hoek- en knooppuntservers opnieuw. Meld u aan bij de toepassing en probeer een nieuwe blogpost toe te voegen. Zodra u op klikt Toevoegen knop, controleer de browserconsole en u hebt het succesantwoord geregistreerd.

Wanneer de details van de blogpost met succes aan de database zijn toegevoegd, moet u de pop-up sluiten. Om de pop-up te sluiten, is er een knop Sluiten die u programmatisch moet aanklikken.

Je zult de gebruiken @ViewChild decorateur om toegang te krijgen tot de knop Sluiten.

Importeren ViewChild en ElementRef in AddPostComponent.

importeer Component, ViewChild, ElementRef van '@ angular / core';

Binnen in de AddPostComponent, definieer de volgende variabele:

@ViewChild ('closeBtn') closeBtn: ElementRef;

Start het closeBtn klik met behulp van de volgende code:

this.closeBtn.nativeElement.click ();

Voeg de bovenstaande code toe aan de succes-callback van de addPost methode. Hier is de addPost methode van add-post.component.ts.

addPost () if (this.post.title && this.post.description) this.addPostService.addPost (this.post) .subscribe (res => this.closeBtn.nativeElement.click (););  else alert ('Titel en omschrijving vereist'); 

Sla de wijzigingen op en start de clientserver opnieuw op. Log in op de applicatie en probeer een nieuw blogbericht toe te voegen. Zodra de details van de blogpost succesvol zijn opgeslagen, wordt de pop-up gesloten.

De bloglijst vernieuwen

Een ding om op te letten is dat het nieuw toegevoegde blogbericht niet in de lijst met blogberichten staat. U moet dus een trigger toevoegen om te melden wanneer u de update moet uitvoeren ShowPostComponent. U maakt gebruik van een gemeenschappelijke service om te communiceren tussen de twee componenten.

Maak een map met de naam service binnen in de src / app map. Maak een bestand met de naam common.service.ts met de volgende code:

Injectable importeren vanuit '@ angular / core'; importeer Subject van 'rxjs / Subject'; @Injectable () exportklasse CommonService public postAdded_Observable = new Subject (); constructor ()  notifyPostAddition () this.postAdded_Observable.next (); 

Zoals te zien is in de bovenstaande code, hebt u verklaard een Onderwerpen riep postAdded_Observable om de nieuwe toevoeging aan de database bij te houden. Telkens wanneer een nieuwe blogpost aan de database wordt toegevoegd, belt u de notifyPostAddition methode, die de abonnees op de hoogte brengt van de update.

Importeer de CommonService in app.module.ts en neem het op in de NgModule lijst van providers. Hier is hoe het eruit ziet:

import BrowserModule vanuit '@ angular / platform-browser'; import NgModule uit '@ angular / core'; importeer ROUTING van './app.routing'; importeer FormsModule vanuit '@ angular / forms'; importeer HttpClientModule van '@ angular / common / http'; importeer RootComponent van './root/root.component'; importeer LoginComponent van './login/login.component'; importeer HomeComponent uit './home/home.component'; import ShowPostComponent vanuit './show-post/show-post.component'; import AddPostComponent uit './add-post/add-post.component'; import CommonService van './service/common.service'; @NgModule (verklaringen: [RootComponent, LoginComponent, HomeComponent, ShowPostComponent, AddPostComponent], invoer: [BrowserModule, ROUTING, FormsModule, HttpClientModule], providers: [CommonService], bootstrap: [RootComponent]) exportklasse AppModule  

Importeren CommonService in de Show-post.component.ts bestand en initialiseer het in de constructormethode.

import CommonService van '... /service/common.service';
constructor (private showPostService: ShowPostService, private commonService: CommonService) 

Binnen in de ngOnInit methode, abonneren op de postAdded_Observable verander en laad de getAllPost methode. Hier is hoe het ngOnInit methode lijkt:

ngOnInit () this.getAllPost (); this.commonService.postAdded_Observable.subscribe (res => this.getAllPost ();); 

Importeren CommonService in de add-post.component.ts bestand en bel de notifyPostAddition methode zodra de blogpost is toegevoegd. Hier is hoe het addPost methode van de AddPostComponent ziet:

addPost () if (this.post.title && this.post.description) this.addPostService.addPost (this.post) .subscribe (res => this.closeBtn.nativeElement.click (); this.commonService. notifyPostAddition (););  else alert ('Titel en omschrijving vereist'); 

Sla de bovenstaande wijzigingen op en start de clientserver opnieuw op. Log in op de applicatie en voeg een nieuwe blogpost toe. Na toevoeging wordt de blogberichtenlijst bijgewerkt met het nieuwe blogbericht.

Inpakken

In deze zelfstudie hebt u de gemaakt AddPostComponent om de blogpostdetails aan de MongoDB-database toe te voegen. U hebt de REST API gemaakt voor het opslaan van een blogpost in de MongoDB-database met behulp van de Mangoest cliënt.

In het volgende deel van de serie implementeert u de functionaliteit om de details van de blogpost te bewerken en bij te werken.

Broncode voor deze tutorial is beschikbaar op GitHub.

Hoe was je ervaring tot nu toe? Laat me uw waardevolle suggesties weten in de onderstaande opmerkingen.