Gyakorlat – express.js Csatlakozás az Azure Database for PostgreSQL-be

Befejeződött

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.

  1. 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.

  2. 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.

  3. 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.

  4. Futtassa a következő parancsot az Express.js projektfüggőségként való hozzáadásához:

    npm install express
    
  5. Futtassa a következő parancsot egy index.js nevű fájl létrehozásához a can-express mappában:

    touch ./index.js
    
  6. Futtassa a következő parancsot az újonnan létrehozott index.js fájl megnyitásához a kódszerkesztőben:

    code index.js
    
  7. 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álataconst 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.

  8. 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.

  1. 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
    
  2. 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')
    
  3. 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.

  4. 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);
    });
    
  5. 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. A freezeTableName: 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.

  1. 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.

  2. 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.

  1. 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
    
  2. 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
    
  3. 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.

  4. 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.

  5. 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.