Gyakorlat – Alapszintű webalkalmazás létrehozása
Eddig a MongoDB-t és a Node.js-t telepítette Ubuntu rendszerű virtuális gépére. Ideje létrehozni egy alapszintű webalkalmazást, hogy lássuk működni. Eközben az is kiderül, hogyan illik a képbe az AngularJS és az Express.
Tanulni példák alapján lehet a legjobban. A készítendő webalkalmazás egy egyszerű könyv-adatbázist valósít meg. A webalkalmazással listázhatja a könyvek adatait, új könyveket vehet fel, és törölheti a meglévő könyveket.
Az itt bemutatott webalkalmazás számos olyan alapelvet szemléltet, amely a MEAN verem webalkalmazások többségére érvényes. Igényei és érdeklődése szerint fedezheti fel a saját MEAN verem alkalmazások készítéséhez szükséges funkciókat.
Így fog kinézni a Books webalkalmazás.
A MEAN egyes összetevőinek szerepe a következő.
- A MongoDB információkast tárol a könyvekről.
- Az Express.js minden HTTP-kérést a megfelelő kezelőhöz irányít.
- Az AngularJS köti össze a felhasználói felületet a program üzleti logikájával.
- A Node.js üzemelteti a kiszolgálóoldali alkalmazást.
Fontos
Itt, tanulási célra, egy alapszintű webalkalmazást készítünk. A célja a MEAN verem tesztelése, és a működésének bemutatása. Az alkalmazás nem elég biztonságos vagy éles használatra kész.
Mi lesz az Express szerepe?
Az eddigiekben a MongoDB-t és a Node.js-t telepítette virtuális gépére. Mi a helyzet az Express.js-sel, az E a MEAN betűszóval?
Az Express.js egy olyan webkiszolgáló-keretrendszer, amely a Node.js számára készült, amely leegyszerűsíti a webalkalmazások létrehozásának folyamatát.
Az Express fő rendeltetése a kérések irányításának kezelése. Irányításon itt azt értjük, hogy hogyan válaszol az alkalmazás egy adott végponthoz küldött kérésre. A végpont egy elérési útból vagy URI-ból, valamint egy kérési módszerből, például GET vagy POST-ből áll. A /book
végponthoz intézett GET kérésre válaszolhat például az adatbázisban lévő könyvek teljes listájával. Egy ugyanazon végponthoz küldött POST kérésre válaszolhat azzal, hogy új bejegyzést vesz fel az adatbázisba a felhasználó által a webes űrlapon kitöltött mezők alapján.
A rövidesen elkészülő webalkalmazásban az Express használatával fogja irányítani a HTTP-kéréseket, és visszaadni a webes tartalmat a felhasználónak. Az Express a HTTP-cookie-k kezelésében és a lekérdezési sztringek feldolgozásában is segíthet a webalkalmazásnak.
Az Express egy Node.js-csomag. Node.js-csomagok telepítésére és kezelésére a Node.js-hez tartozó npm segédprogramot használhatja. A lecke későbbi részében létre fog hozni egy expressz és egyéb függőségek definiálásához elnevezett package.json
fájlt, majd a parancs futtatásával telepítheti ezeket a npm install
függőségeket.
Mi lesz az AngularJS-szel?
Ahogyan az Expresst, a MEAN A betűjének megfelelő AngularJS-t sem telepítette még.
Az AngularJS megkönnyíti a webalkalmazások írását és tesztelését, mivel lehetővé teszi, hogy jobban elkülönítse a weblap megjelenését – a HTML-kódját – a weblap viselkedésétől. Ha ismeri a modell-nézet-vezérlő (MVC) mintázatot, vagy az adatkötés fogalmát, akkor az AngularJS-t is ismerősnek fogja találni.
Az AngularJS úgynevezett előtéri JavaScript-keretrendszer, vagyis csak az alkalmazáshoz hozzáférő ügyfélen kell elérhetőnek lennie. Másként fogalmazva az AngularJS nem az Ön webkiszolgálóján, hanem a felhasználó webböngészőjében fut. Mivel pedig az AngularJS JavaScript, könnyen felhasználható arra, hogy az oldalon megjelenítendő adatokat olvasson be a webkiszolgálóról.
Az AngularJS-t igazából nem kell telepíteni. Ehelyett egy hivatkozást kell megadni a HTML-oldalon a JavaScript-fájlban, ahogyan más JavaScript-kódtárak esetén. Az AngularJS-t több módon is belefoglalhatja weblapjaiba. Itt betölti az AngularJS-t egy tartalomkézbesítési hálózatból vagy CDN-ből. A CDN képek, videók és más tartalmak földrajzi elosztására szolgál a gyorsabb letöltés érdekében.
Ezt a kódot még ne illessze be, de ez egy olyan példa, amely az AngularJS-t tölti be egy CDN-ből. Ezt a kódot általában a <head>
HTML-oldal szakaszához kell hozzáadnia.
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.2/angular.min.js"></script>
Megjegyzés:
Az AngularJS nem tévesztendő össze az Angularral. Bár a kettő alapelvei között sok a hasonlóság, az AngularJS az Angular elődje. Az AngularJS-t még mindig gyakran használják webalkalmazások készítésére. Míg az AngularJS alapja a JavaScript, az Angular a TypeScriptre, a JavaScript programok írását megkönnyítő programozási nyelvre épül.
Hogyan készítem el az alkalmazást?
Itt egy egyszerű eljárást fog követni. Az alkalmazáskódot a Cloud Shellből írja meg, majd az SCP biztonságos másolási protokoll használatával másolja a fájlokat a virtuális gépére. Ezután elindítja a Node.js alkalmazást, és az eredményeket a böngészőben látja.
A gyakorlatban általában helyi környezetben, például a laptopról vagy egy helyileg futtatott virtuális gépről kell írni és tesztelni a webalkalmazást. Ezután a kódot egy verziókövetési rendszerben, például a Gitben tárolhatja, és egy folyamatos integrációs és folyamatos kézbesítési rendszert ( például az Azure DevOpst) használva tesztelheti a módosításokat, és feltöltheti őket a virtuális gépre. A modul végén további forrásokat is ajánlunk.
A Books webalkalmazás létrehozása
Itt létrehozza a webalkalmazást alkotó összes kódot, szkriptet és HTML-fájlt. Az áttekinthetőség kedvéért kiemeljük az egyes fájlok lényeges részleteit, de az összes részletet nem fogjuk tárgyalni.
Ha még mindig fennáll az SSH-kapcsolat a virtuális gépével, zárja be az SSH-munkamenetet az exit
paranccsal, és térjen vissza a Cloud Shellbe.
exit
Ezzel visszatért Cloud Shell-munkamenetéhez.
A fájlok létrehozása
A Cloud Shellben futtassa ezeket a parancsokat a webalkalmazás mappáinak és fájljainak létrehozásához:
cd ~ mkdir Books touch Books/server.js touch Books/package.json mkdir Books/app touch Books/app/model.js touch Books/app/routes.js mkdir Books/public touch Books/public/script.js touch Books/public/index.html
Ezek a következők:
Books
a projekt gyökérkönyvtára.- A
server.js
fájl a webalkalmazás belépési pontját határozza meg. Betölti a szükséges Node.js-csomagokat, megadja a figyelendő portot, és figyelni kezdi a bejövő HTTP-forgalmat. - A
package.json
fájl az alkalmazásról nyújt olyan adatokat, mint a név, a leírás, valamint hogy milyen Node.js-csomagokra van szükség az alkalmazás futásához.
- A
Books/app
a kiszolgálón futó kódot tartalmaz.- A
model.js
fájl az adatbázis-kapcsolatot és -sémát definiálja. Felfogható az alkalmazás adatmodelljeként. - A
routes.js
fájl a kérések irányítását kezeli. Ez definiálja például a/book
végponthoz intézett GET kéréseket az adatbázisban lévő könyvek teljes listájának megadásával.
- A
Books/public
a közvetlenül az ügyfél böngészőjének felkínált fájlokat tartalmazza.- Az
index.html
fájl az indexlapot tartalmazza. Tartalmaz egy webes űrlapot, amelyen a felhasználó a könyvekkel kapcsolatos információkat adhat meg. Az adatbázisban lévő összes könyvet is megjeleníti, és lehetővé teszi bejegyzések törlését az adatbázisból. - A
script.js
fájl a felhasználó webböngészőjében futó JavaScript-kódot tartalmaz. Kéréseket küldhet a kiszolgálónak könyvek listázására, könyveket vehet fel az adatbázisba, és könyveket törölhet az adatbázisból.
- Az
A Cloud Shell szerkesztőjében a
code
paranccsal nyithatja meg fájljait.code Books
Az adatmodell létrehozása
Nyissa meg
app/model.js
és adja hozzá a következőt a szerkesztőben:var mongoose = require('mongoose'); var dbHost = 'mongodb://localhost:27017/Books'; mongoose.connect(dbHost, { useNewUrlParser: true } ); mongoose.connection; mongoose.set('debug', true); var bookSchema = mongoose.Schema( { name: String, isbn: {type: String, index: true}, author: String, pages: Number }); var Book = mongoose.model('Book', bookSchema); module.exports = Book;
Fontos
Mindenképp mentsen, miután beilleszt vagy módosít valamit a szerkesztőben megnyitott fájlban. Ehhez használhatja a „...” menüt, vagy a mentésre szolgáló billentyűparancsot (Ctrl + S Windows és Linux rendszeren, Command + S macOS rendszeren).
Ez a kód a Mongoose használatával egyszerűsíti a MongoDB-be és onnan kifelé irányuló adatátvitel folyamatát. A Mongoose egy adatmodellezéshez használható sémaalapú rendszer. Ez a kód definiál egy „Book” nevű adatbázis-dokumentumot, a megadott sémával. A séma négy mezőt határoz meg egy könyv leírására:
- A könyv neve, vagyis címe
- Nemzetközi standard könyvszáma (ISBN), amely egyedileg azonosítja a könyvet
- Szerzője
- Oldalainak száma
A következő lépésben a GET, POST és DELETE kéréseket adatbázis-műveletekre leképező HTTP-kezelőket fogja létrehozni.
A HTTP-kéréseket kezelő Express.js-útvonalak létrehozása
A szerkesztőben nyissa meg
app/routes.js
és adja hozzá a következő kódot:var path = require('path'); var Book = require('./model'); var routes = function(app) { app.get('/book', function(req, res) { Book.find({}, function(err, result) { if ( err ) throw err; res.json(result); }); }); app.post('/book', function(req, res) { var book = new Book( { name:req.body.name, isbn:req.body.isbn, author:req.body.author, pages:req.body.pages }); book.save(function(err, result) { if ( err ) throw err; res.json( { message:"Successfully added book", book:result }); }); }); app.delete("/book/:isbn", function(req, res) { Book.findOneAndRemove(req.query, function(err, result) { if ( err ) throw err; res.json( { message: "Successfully deleted the book", book: result }); }); }); app.get('*', function(req, res) { res.sendFile(path.join(__dirname + '/public', 'index.html')); }); }; module.exports = routes;
Ez a kód négy útvonalat hoz létre az alkalmazás számára. Röviden mindegyiket ismertetjük.
HTTP-parancs Végpont Leírás GET /book
Minden könyvet lekér az adatbázisból. POST /book
Létrehoz egy Book
objektumot a felhasználó által a webes űrlapon megadott mezők alapján, és az adatbázisba írja ezt az objektumot.Törlés... /book/:isbn
Törli az adatbázisból az ISBN-száma alapján azonosított könyvet. GET *
Ha nincs más megfelelő útvonal, akkor az indexlapot adja vissza. Az Express.js közvetlenül az útvonalkezelő kódban képes HTTP-válaszokat kiszolgálni, vagy statikus tartalmakat képes kiszolgálni a fájlokból. Ez a kód mindkettőt bemutatja. Az első három útvonal JSON-adatokkal válaszol a könyvekre vonatkozó API-kérésekre. A negyedik (alapértelmezett) útvonal az
index.html
indexlap tartalmát adja vissza.
Az ügyféloldali JavaScript-alkalmazás létrehozása
A szerkesztőből nyissa meg a
public/script.js
fájlt, és egészítse ki ezzel a kóddal:var app = angular.module('myApp', []); app.controller('myCtrl', function($scope, $http) { var getData = function() { return $http( { method: 'GET', url: '/book' }).then(function successCallback(response) { $scope.books = response.data; }, function errorCallback(response) { console.log('Error: ' + response); }); }; getData(); $scope.del_book = function(book) { $http( { method: 'DELETE', url: '/book/:isbn', params: {'isbn': book.isbn} }).then(function successCallback(response) { console.log(response); return getData(); }, function errorCallback(response) { console.log('Error: ' + response); }); }; $scope.add_book = function() { var body = '{ "name": "' + $scope.Name + '", "isbn": "' + $scope.Isbn + '", "author": "' + $scope.Author + '", "pages": "' + $scope.Pages + '" }'; $http({ method: 'POST', url: '/book', data: body }).then(function successCallback(response) { console.log(response); return getData(); }, function errorCallback(response) { console.log('Error: ' + response); }); }; });
Figyelje meg, hogy a kód egy „myApp” nevű modult és egy „myCtrl” nevű vezérlőt definiál. A modulok és vezérlők működését itt nem tárgyaljuk részletesen, de ezeket a neveket használni fogja a következő lépésben, amikor összeköti a felhasználói felületet (a HTML-kódot) és az alkalmazás üzleti logikáját.
A fentiekben négy útvonalat hozott létre, amelyek a különböző GET, POST és DELETE műveleteket kezelik a kiszolgálón. Ez a köd ezekhez a műveletekhez hasonlít, de az ügyfél oldaláról (a felhasználó webböngészőjéből).
A
getData
függvény például egy GET kérést küld a/book
végponthoz. Mint bizonyára emlékszik, a kiszolgáló ezt a kérést úgy kezeli, hogy minden könyv adatait lekéri az adatbázisból, és ezt az információt adja vissza JSON-adatok formájában. Figyelje meg, hogy az eredményként előálló JSON-adatok a$scope.books
változóhoz vannak hozzárendelve. A következő lépésben megtudhatja, hogy ez hogyan befolyásolja, hogy a felhasználó mit lát a weblapon.Ez a kód az oldal betöltésekor hívja meg a
getData
függvényt. Adel_book
és azadd_book
függvény tanulmányozásával Ön is megállapíthatja, hogy hogyan működnek. Nincs szükség ügyféloldali kódra a kiszolgáló alapértelmezett kezelőjének megfelelően, mert az alapértelmezett kezelő az indexlapot adja vissza, nem pedig a JSON-adatokat.
A felhasználói felület létrehozása
A szerkesztőből nyissa meg a
public/index.html
fájlt, és egészítse ki ezzel a kóddal:<!doctype html> <html ng-app="myApp" ng-controller="myCtrl"> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.2/angular.min.js"></script> <script src="script.js"></script> </head> <body> <div> <table> <tr> <td>Name:</td> <td><input type="text" ng-model="Name"></td> </tr> <tr> <td>Isbn:</td> <td><input type="text" ng-model="Isbn"></td> </tr> <tr> <td>Author:</td> <td><input type="text" ng-model="Author"></td> </tr> <tr> <td>Pages:</td> <td><input type="number" ng-model="Pages"></td> </tr> </table> <button ng-click="add_book()">Add</button> </div> <hr> <div> <table> <tr> <th>Name</th> <th>Isbn</th> <th>Author</th> <th>Pages</th> </tr> <tr ng-repeat="book in books"> <td><input type="button" value="Delete" data-ng-click="del_book(book)"></td> <td>{{book.name}}</td> <td>{{book.isbn}}</td> <td>{{book.author}}</td> <td>{{book.pages}}</td> </tr> </table> </div> </body> </html>
Ez a kód létrehoz egy egyszerű HTML-űrlapot, amely négy mezőt tartalmaz a könyvadatok elküldéséhez, valamint egy táblát, amely megjeleníti az adatbázisban tárolt összes könyvet.
Habár egy szabványos HTML-kód, a
ng-
HTML-attribútumok talán nem ismerősek. Ezek a HTML-attribútumok fűzik össze az AngularJS-kódot a felhasználói felülettel. Amikor például a Hozzáadás lehetőséget választja, az AngularJS meghívja azadd_book
függvényt, amely elküldi a kiszolgálónak az űrlap adatait.Itt megvizsgálhatja a kódot, hogy képet kapjon arról, hogy az egyes attribútumok hogyan kapcsolódnak az
ng-
alkalmazás üzleti logikájához.
Az Express.js-kiszolgáló létrehozása az alkalmazás üzemeltetéséhez
A szerkesztőből nyissa meg a
server.js
fájlt, és egészítse ki ezzel a kóddal:var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(express.static(__dirname + '/public')); app.use(bodyParser.json()); require('./app/routes')(app); app.set('port', 80); app.listen(app.get('port'), function() { console.log('Server up: http://localhost:' + app.get('port')); });
Ez a kód magát a webalkalmazást hozza létre. Statikus fájlokat szolgál ki a
public
címtárból, és a korábban megadott útvonalakat használja a kérések kezeléséhez.
Csomagadatok és függőségek definiálása
Mint láttuk, a package.json
fájl az alkalmazásról nyújt olyan adatokat, mint a név, a leírás, valamint hogy milyen Node.js-csomagokra van szükség az alkalmazás futásához.
A szerkesztőből nyissa meg a
package.json
fájlt, és egészítse ki ezzel a kóddal:{ "name": "books", "description": "Sample web app that manages book information.", "license": "MIT", "repository": { "type": "git", "url": "https://github.com/MicrosoftDocs/mslearn-build-a-web-app-with-mean-on-a-linux-vm" }, "main": "server.js", "dependencies": { "express": "~4.16", "mongoose": "~5.3", "body-parser": "~1.18" } }
Itt az alkalmazásról szóló információkat, vagyis metaadatokat talál, köztük a nevét, a leírását és a licencét.
A repository
mező azt adja meg, hogy a kód hol van kezelve. Referenciaként később a GitHubon, vagy az itt megjelenő URL-címen tekintheti át a kódot.
A main
mező az alkalmazás belépési pontját adja meg. A teljesség érdekében itt érhető el, de ez nem fontos, mert nem tervezi az alkalmazást Node.js-csomagként közzétenni mások számára, hogy letölthessenek és használhassa.
A dependencies
mező fontos. Ez adja meg az alkalmazáshoz szükséges Node.js-csomagokat. Rövidesen ismét csatlakozni fog virtuális gépéhez, és az npm install
paranccsal telepíteni fogja ezeket a csomagokat.
A Node-csomagok általában a szemantikus verziószámozás nevű verziókezelési sémát használják. A verziószám három részből áll: főverzió, alverzió és javítás. A hullámos vonal ~
jel itt arra utasítja az npm segédprogramot, hogy a megadott fő- és alverziószám alatti legújabb javítást telepítse. Az itt látható verziók a legújabbak, amelyekkel ezt a modult tesztelték. A gyakorlatban idővel növelheti a verziószámot, miközben alkalmazását az egyes függő csomagok által kínált legújabb funkciók kihasználása érdekében frissíti és teszteli.
A fájlok átmásolása a virtuális gépre
A folytatás előtt győződjön meg arról, hogy a virtuális gép IP-címe kéznél van. Ha nem rendelkezik vele, futtassa az alábbi parancsokat a Cloud Shellből a lekéréséhez:
ipaddress=$(az vm show \
--name MeanStack \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--show-details \
--query [publicIps] \
--output tsv)
echo $ipaddress
A fájlok szerkesztésével már végzett. Győződjön meg arról, hogy az egyes fájlok módosításait mentette, majd zárja be a szerkesztőt.
A szerkesztő bezárásához jelölje ki a jobb felső sarokban lévő három pontot, majd válassza a Szerkesztő bezárása lehetőséget.
Futtassa a következő
scp
parancsot a Cloud Shell-munkamenet könyvtárának~/Books
tartalmának a virtuális gép ugyanazon könyvtárnevére való másolásához:scp -r ~/Books azureuser@$ipaddress:~/Books
További Node-csomagok telepítése
Tegyük fel, hogy a fejlesztési folyamat során további Node-csomagokat talált, amelyeket használni szeretne. Idézze fel például, hogy az app/model.js
fájl első sora a következő.
var mongoose = require('mongoose');
Mint tudja, az alkalmazás a Mongoose használatával segíti az adatok átvitelét a MongoDB-adatbázisba és onnan kifelé.
Az alkalmazáshoz express.js és törzselemző csomagok is szükségesek. A Body-parser egy beépülő modul, amely lehetővé teszi az Express számára, hogy az ügyfél által küldött webes űrlap adataival dolgozzon.
Csatlakozzunk a virtuális géphez, és telepítsük a package.json
fájlban megadott csomagokat.
A virtuális géphez való csatlakozás előtt győződjön meg arról, hogy kéznél van a virtuális gép IP-címe. Ha nem rendelkezik vele, futtassa az előző szakaszban található Cloud Shell-parancsokat a lekéréséhez.
Ahogyan korábban is tette, hozzon létre egy SSH-kapcsolatot a virtuális géppel:
ssh azureuser@$ipaddress
Ugrás a
Books
kezdőkönyvtár alatti könyvtárra:cd ~/Books
Futtassa
npm install
a függő csomagok telepítését:sudo apt install npm -y && npm install
Tartsa nyitva az SSH-kapcsolatot a következő szakaszban.
Az alkalmazás tesztelése
Ezzel készen áll saját Node.js-webalkalmazása tesztelésére!
~/Books
A címtárban futtassa ezt a parancsot a webalkalmazás elindításához:sudo nodejs server.js
Ez a parancs úgy indítja el az alkalmazást, hogy a 80-as porton figyeli a bejövő HTTP-kéréseket.
Egy külön böngészőlapon nyissa meg virtuális gépe nyilvános IP-címét.
Az indexlap jelenik meg, amely egy webes űrlapot is tartalmaz.
Próbáljon meg felvenni néhány könyvet az adatbázisba. Valahányszor felvesz egy könyvet, az oldal a könyvek teljes listájával frissül.
A könyv adatbázisból való törléséhez a Törlés lehetőséget is választhatja.