Gyakorlat – express.js Csatlakozás az Azure Database for PostgreSQL-be
Ez a gyakorlat végigvezeti egy Express.js-alapú webszolgáltatás létrehozásának és konfigurálásának folyamatán, amely hozzáférést biztosít az Azure Database for PostgreSQL-hez.
Ebben a gyakorlatban a következőket fogja végrehajtani:
- Hozzon létre egy node.js Express-webalkalmazást.
- Csatlakozás a Node.js Express webalkalmazást az Azure Database for PostgreSQL-be.
- A Node.js Express-útvonalak konfigurálása az Azure Database for PostgreSQL-hez való hozzáféréshez.
- Ellenőrizze a Node.js Express webszolgáltatás funkcióit.
Előfeltételek
A gyakorlat elvégzéséhez a következőkre van szüksége:
- Azure-előfizetés.
- Egy Microsoft-fiók vagy egy Microsoft Entra-fiók, amely globális Rendszergazda istrator szerepkörrel rendelkezik az Azure-előfizetéshez társított Microsoft Entra-bérlőben, valamint az Azure-előfizetés tulajdonosi vagy közreműködői szerepkörével.
- A modul első gyakorlatának elvégzése. A gyakorlatban létrehozott és konfigurált Azure PostgreSQL-adatbázist fogja használni.
Node.js Express-minta webalkalmazás létrehozása
Először hozzon létre egy Node.js Express-webalkalmazást, és alkalmazza rá a növekményes módosításokat a kívánt funkció implementálásához.
Szükség esetén indítsa el a webböngészőt a számítógépéről, lépjen az Azure Portalra , és jelentkezzen be a modul első gyakorlatában használt Azure-előfizetés eléréséhez.
Az Azure Portalon indítsa el a Bash-munkamenetet a Cloud Shellben a keresőmező melletti eszköztár ikonjának kiválasztásával.
A Cloud Shell panel Bash-munkamenetében futtassa a következő parancsokat egy Node.js-projekt inicializálásához egy új könyvtárban:
mkdir -p cna-express && cd cna-express npm init -y
Megjegyzés:
Ez létrehoz egy package.json fájlt, amely a projekt összes függőségét tartalmazza.
Futtassa a következő parancsot az Express.js projektfüggőségként való hozzáadásához:
npm install express
Futtassa a következő parancsot egy index.js nevű fájl létrehozásához a can-express mappában:
touch ./index.js
Futtassa a következő parancsot az újonnan létrehozott index.js fájl megnyitásához a kódszerkesztőben:
code index.js
A kódszerkesztővel adja hozzá az index.js fájlhoz a következő tartalmat, és mentse a fájlt:
const express = require('express') const port = process.env.PORT || 8080 const app = express() app.use(express.json()); app.listen(port, () => console.log(`Sample app is listening on port ${port}!`))
Megjegyzés:
Ha fájlokat szeretne menteni a kódszerkesztőben, használja a ctrl+s billentyűkombinációt. A szerkesztőablak bezárásához használja a ctrl+q billentyűkombinációt vagy a panel jobb oldalán található menüt.
A szkript meghívja az alkalmazást, konfigurálja a 8080-at tartalmazó TCP-port figyelésére és a HTTP-kérések JSON-formátumú törzsének elfogadására. A JSON-elemzéshez az Express 4.16+
app.use(express.json())
-tól kezdve szükséges.A process.env.PORT használata a Azure-alkalmazás szolgáltatás tárolóira vonatkozik, amely beállítja a Node.js tároló PORT környezeti változóját, és elküldi a bejövő kéréseket erre a portszámra. A kérések fogadásához az alkalmazásnak figyelnie kell a portot a process.env.PORT használatával (így a használata
const port = process.env.PORT || 8080
).Megjegyzés:
Ebben a gyakorlatban a Azure-alkalmazás Szolgáltatást fogja használni a Node.js Express funkció tesztelésének megkönnyítésére. Az alkalmazást tárolóba is helyezheti és üzembe helyezheti a Kubernetes és az AKS használatával, ahogy azt egy korábbi modulban is bemutatták.
A szkript futtatásának engedélyezéséhez a kódszerkesztővel módosítsa az automatikusan létrehozott package.json fájlt úgy, hogy lecseréli a meglévő tartalmát a következő tartalomra:
{ "name": "node-express", "version": "1.0.0", "description": "Node.js express sample", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "nodemon index.js" }, "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1", "http": "0.0.0", "morgan": "^1.10.0" }, "devDependencies": { "nodemon": "^2.0.2" } }
A Node.js Express webalkalmazás Csatlakozás az Azure Database for PostgreSQL-be
Ezután konfigurálja az újonnan létrehozott Node.js Express-webalkalmazást a modul előző gyakorlatában létrehozott cnainventory-adatbázishoz való csatlakozáshoz. Ehhez a Sequelize-t fogja használni, amely egy népszerű JavaScript-kódtár, amely biztosítja az Object-Relation Mapper funkciót, lehetővé téve a programozott szerkezetek megfelelő adatbázissé való leképezését.
A számítógépről az Azure Portalt megjelenítő böngészőablakban, a Cloud Shell panel Bash-munkamenetében futtassa a következő parancsot a Folytatás és a megfelelő PostgreSQL-specifikus csomagok hozzáadásához a projekthez:
npm i sequelize pg pg-hstore
Az új képességek kihasználásához a kódszerkesztővel adja hozzá a következő sort az index.js fájl elejéhez:
const Sequelize = require('sequelize')
Az adatbázishoz való csatlakozáshoz hozzá kell adnia egy sequalize-specifikus formátumú kapcsolati sztring az index.js fájlhoz az előző lépésben hozzáadott sort követve. Cserélje le a
<server_name>
helyőrzőt az előző gyakorlatban kiépített Azure Database for PostgreSQL-kiszolgáló nevére:const sequelize = new Sequelize('postgres://Student%40<server_name>:Pa55w0rd1234@<server_name>.postgres.database.azure.com:5432/cnainventory')
Megjegyzés:
A(z) %40 feloldó karakter használata a felhasználónév és a kiszolgálónév között az Azure Database for PostgreSQL kapcsolati sztring.
Ha a Sequelize csomagot követelményként tartalmazza, és a kapcsolati sztring konfigurálva van, most már kapcsolatot létesíthet a cnainventory adatbázissal úgy, hogy hozzáadja az alábbi kódot az index.js fájlhoz az előző lépésben hozzáadott kód után:
sequelize .authenticate() .then(() => { console.log('Connection has been established successfully.'); }) .catch(err => { console.error('Unable to connect to the database:', err); });
Az előző gyakorlatban létrehozott leltártábla műveleteinek megkönnyítéséhez hozzá kell adnia az index.js fájlhoz az előző lépésben hozzáadott kód után egy, a táblázat formátumának megfelelő szekvenálási definíciót, az alábbiak szerint:
const Inventory = sequelize.define('inventory', { id: { type: Sequelize.INTEGER, allowNull: false, primaryKey: true }, name: { type: Sequelize.STRING, allowNull: false }, quantity: { type: Sequelize.INTEGER }, date: { type: Sequelize.DATEONLY, defaultValue: Sequelize.NOW } }, { freezeTableName: true, timestamps: false });
Megjegyzés:
A
timestamps: false
beállításnak ki kell zárnia az adatbázis-műveletek hatóköréből egy időhöz kapcsolódó oszlopkészletet, amely ebben az esetben nem létezik. AfreezeTableName: true
beállítás letiltja a Szekvenálás alapértelmezett viselkedését, amely automatikusan többes számmá alakítja az összes modellnevet.
Node.js Express-útvonalak konfigurálása az Azure Database for PostgreSQL-hez való hozzáféréshez
Most már konfigurálhatja azokat az útvonalakat, amelyek olvasási és írási hozzáférést biztosítanak a leltártáblához az Azure Database for PostgreSQL-kiszolgáló által üzemeltetett cnainventory adatbázisban. Az egyszerűség kedvéért csak két útvonalat fog implementálni, de a többi útvonal konfigurálásának eljárása nagyon hasonlít az ebben a feladatban végighaladni kívánt implementációra. Az első útvonal lehetővé teszi, hogy egyedi leltárelemeket adjon hozzá egy HTTP POST-kérés meghívásával a kérelem törzsében található készletelem-értékekkel, míg a második útvonal HTTP GET-kérelmeket dolgoz fel, és visszaad egy leltárelemet az azonosító attribútum értéke alapján.
A számítógépről, az Azure Portalt megjelenítő webböngészőablakban, a Cloud Shell panel Bash-munkamenetében a kódszerkesztővel adja hozzá a következő tartalmat az index.js fájl végéhez:
app.post('/inventory', async (req, res) => { try { const newItem = new Inventory(req.body) await newItem.save() res.json({ inventory: newItem }) } catch(error) { console.error(error) }})
Megjegyzés:
A szkript ezen része kezeli a HTTP POST-kérelmeket, és hozzáad egy sort a készlettáblához, amely a kérelem törzsében szereplő azonosító, név és mennyiség attribútumokkal van feltöltve. A dátumattribútum értékét a rendszer automatikusan kiszámítja az aktuális dátum alapján. A művelet az újonnan hozzáadott értékeket adja vissza a sikeres művelet megerősítéseként.
A kódszerkesztőben adja hozzá a következő tartalmat az index.js fájlhoz az előző lépésben hozzáadott szkriptet követve:
app.get('/inventory/:id', async (req, res) => { const id = req.params.id try { const inventory = await Inventory.findAll({ attributes: ['id', 'name', 'quantity', 'date'], where: { id: id }}) res.json({ inventory }) } catch(error) { console.error(error) }})
Megjegyzés:
A szkript ezen része kezeli a HTTP GET-kérelmeket, és visszaadja az azonosító, a név, a mennyiség és a dátumattribútumok értékeit a kérelemben szereplő azonosító értéke alapján.
Megjegyzés:
Ez egy teljesen működőképes szkriptet eredményez a következő formátumban (ha ezt a kódot szeretné másolni, mindenképpen cserélje le a
cnapostgresqldb
név minden előfordulását a PostgreSQL-kiszolgáló nevére):const Sequelize = require('sequelize') const sequelize = new Sequelize('postgres://Student%40postgresql-ek.postgres.database.azure.com:Pa55w0rd1234@postgresql-ek.postgres.database.azure.com:5432/cnainventory') sequelize .authenticate() .then(() => { console.log('Connection has been established successfully.'); }) .catch(err => { console.error('Unable to connect to the database:', err); }); const Inventory = sequelize.define('inventory', { id: { type: Sequelize.INTEGER, allowNull: false, primaryKey: true }, name: { type: Sequelize.STRING, allowNull: false }, quantity: { type: Sequelize.INTEGER }, date: { type: Sequelize.DATEONLY, defaultValue: Sequelize.NOW } }, { freezeTableName: true, timestamps: false }); const express = require('express') const port = process.env.PORT || 8080 const app = express() app.use(express.json()); app.listen(port, () => console.log(`Sample app is listening on port ${port}!`)) app.post('/inventory', async (req, res) => { try { const newItem = new Inventory(req.body) await newItem.save() res.json({ inventory: newItem }) } catch(error) { console.error(error) }}) app.get('/inventory/:id', async (req, res) => { const id = req.params.id try { const inventory = await Inventory.findAll({ attributes: ['id', 'name', 'quantity', 'date'], where: { id: id }}) res.json({ inventory }) } catch(error) { console.error(error) }})
A Node.js Express webszolgáltatás működésének ellenőrzése
Végre készen áll a webszolgáltatás funkcióinak tesztelésére. Ezen a ponton tárolóba helyezheti, de az egyszerűség kedvéért üzembe fogja helyezni egy Azure-alkalmazás szolgáltatásban. Ezzel gyorsan ellenőrizheti a funkcióját, és meggyőződhet arról, hogy a tárolók használata életképes megoldás.
Az Azure Portalt megjelenítő böngészőablakban a Cloud Shell panel Bash-munkamenetéből futtassa a következő parancsokat egy olyan erőforráscsoport létrehozásához, amely az Azure-webalkalmazást fogja üzemeltetni, amelyben üzembe helyezi a Node.js Express alkalmazást:
RG1NAME=postgresql-db-RG LOCATION=$(az group show --resource-group $RG1NAME --query location --output tsv) RG2NAME=cna-express-RG az group create --name $RG2NAME --location $LOCATION
Futtassa az alábbi parancsokat egy ingyenes szintű Azure-alkalmazás service-csomag létrehozásához, amely az új Azure-webalkalmazást fogja üzemeltetni:
SPNAME=express-sp az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
Futtassa a következő parancsokat az új Node.js-alapú Azure-webalkalmazás létrehozásához és a kód üzembe helyezéséhez:
WEBAPPNAME=express$RANDOM$RANDOM az webapp create --name $WEBAPPNAME --resource-group $RG2NAME --plan $SPNAME --runtime "NODE|12-lts" cd ~/cna-express git config --global user.email "user1@adatum.com" git config --global user.name "Adatum User1" git init git add -A git commit -m "Initial Commit" DEPLOYMENTUSER=m03User$RANDOM DEPLOYMENTPASS=m03Pass$RANDOM$RANDOM az webapp deployment user set --user-name $DEPLOYMENTUSER --password $DEPLOYMENTPASS echo $DEPLOYMENTUSER echo $DEPLOYMENTPASS RG2NAME=cna-express-RG WEBAPPNAME=$(az webapp list --resource-group $RG2NAME --query "[0].name" --output tsv) DEPLOYMENTURL=$(az webapp deployment source config-local-git --name $WEBAPPNAME --resource-group $RG2NAME --output tsv) git remote add azure $DEPLOYMENTURL git checkout -b master git commit -a -m "test" git push --set-upstream azure master
Megjegyzés:
Amikor a rendszer jelszót kér, írja be a parancsot követően
echo $DEPLOYMENTPASS
megjelenő jelszót.Megjegyzés:
Hagyja figyelmen kívül azokat az üzeneteket, amelyek azt jelzik, hogy a főág már létezik, vagy hogy semmi sem véglegesített.
Futtassa a következő parancsokat a Node.js Express alkalmazás POST HTTP-útválasztásának ellenőrzéséhez:
RG2NAME=cna-express-RG WEBAPPNAME=$(az webapp list --resource-group $RG2NAME --query "[0].name" --output tsv) curl --header "Content-Type: application/json" \ --request POST \ --data '{"id":3,"name":"ice cream","quantity":50}' \ http://$WEBAPPNAME.azurewebsites.net/inventory
Megjegyzés:
A parancsnak az újonnan hozzáadott táblasor bejegyzéseinek értékeit kell visszaadnia, beleértve az automatikusan létrehozott dátumot is. A kimeneti értékek visszaadása egy-két percig is eltarthat.
A Node.js Express alkalmazás GET HTTP-útválasztásának ellenőrzéséhez a Cloud Shell panelt megjelenítő webböngészőben nyisson meg egy másik lapot, keresse meg az Azure Portalt, majd az Erőforrások, szolgáltatások és dokumentumok keresése szövegmezővel keresse meg az üzembe helyezett App Service-webalkalmazást. Lépjen az Áttekintés panelre, azonosítsa az URL-tulajdonság értékét, fűzze hozzá a sztringet
/inventory/3
az ADOTT URL-értékhez, nyisson meg egy másik lapot ugyanabban a böngészőablakban, és keresse meg az újonnan létrehozott URL-sztringet a megfelelő weblap megjelenítéséhez.Megjegyzés:
A lapon az előző lépésben a cnainventory adatbázis leltártáblájában hozzáadott elem tulajdonságainak kell megjelennie.
EREDMÉNY
Gratulálunk! Elvégezte a modul második gyakorlatát. Ebben a gyakorlatban létrehozott és konfigurált egy Express.js-alapú webszolgáltatást, amely hozzáférést biztosít az Azure Database for PostgreSQL-hez. Az ebben a gyakorlatban üzembe helyezett erőforrásokra lesz szükség a modul következő gyakorlatának sikeres elvégzéséhez.