Latihan - Menyambungkan Express.js ke Azure Database for PostgreSQL

Selesai

Latihan ini membawa Anda melalui proses pembuatan dan konfigurasi layanan web berbasis Express.js yang menyediakan akses ke Azure Database for PostgreSQL.

Dalam latihan ini, Anda akan:

  • Membuat sampel aplikasi web Node.js Express.
  • Menyambungkan aplikasi web Node.js Express ke Azure Database for PostgreSQL.
  • Mengonfigurasikan Node.js Express untuk akses ke Azure Database for PostgreSQL.
  • Memvalidasi fungsionalitas layanan web Node.js Express.

Prasyarat

Untuk melakukan latihan ini, Anda membutuhkan:

  • Langganan Azure.
  • Akun Microsoft atau akun Microsoft Entra dengan peran Administrator Global di penyewa Microsoft Entra yang terkait dengan langganan Azure dan dengan peran Pemilik atau Kontributor dalam langganan Azure.
  • Untuk menyelesaikan latihan pertama dalam modul ini. Anda akan menggunakan database Azure PostgreSQL yang Anda buat dan mengonfigurasinya dalam latihan tersebut.

Membuat sampel aplikasi web Node.js Express

Anda akan mulai dengan membuat contoh aplikasi web Node.js Express dan menerapkan perubahan inkremental untuk mengimplementasikan fungsionalitas yang diinginkan.

  1. Jika diperlukan, dari komputer Anda, buka browser web, navigasi ke portal Microsoft Azure dan masuk untuk mengakses langganan Azure yang Anda gunakan dalam latihan pertama modul ini.

  2. Di portal Microsoft Azure, mulai sesi Bash dalam Cloud Shell dengan memilih ikon dari toolbar di samping kotak teks pencarian.

  3. Dalam sesi Bash di panel Cloud Shell, jalankan perintah berikut ini untuk menginisialisasi proyek Node.js dalam direktori baru:

    mkdir -p cna-express && cd cna-express
    npm init -y
    

    Catatan

    Ini menciptakan package.json yang berisi semua dependensi untuk proyek tersebut.

  4. Jalankan perintah berikut untuk menambahkan Express.js sebagai dependensi proyek:

    npm install express
    
  5. Jalankan perintah berikut untuk membuat file yang bernama index.js di folder cna-express:

    touch ./index.js
    
  6. Jalankan perintah berikut untuk membuka file yang baru dibuat index.js di editor kode:

    code index.js
    
  7. Gunakan editor kode untuk menambahkan konten berikut ke file index.js dan menyimpan file-nya:

    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}!`))
    

    Catatan

    Untuk menyimpan file di editor kode, gunakan kombinasi tombol ctrl+s. Untuk menutup panel editor, gunakan kombinasi tombol ctrl+q atau menu di sisi kanan panel.

    Skrip memanggil aplikasi, mengonfigurasinya untuk mendengarkan di port TCP 8080 dan untuk menerima badan permintaan HTTP berformat JSON. Dimulai dengan Express 4.16+, app.use(express.json()) diperlukan untuk penguraian JSON.

    Penggunaan process.env.PORT khusus untuk kontainer di Azure App Service yang menetapkan PORT variabel lingkungan di kontainer Node.js dan mengirimkan permintaan yang masuk ke nomor port tersebut. Untuk menerima permintaan, aplikasi Anda harus mendengarkan port tersebut menggunakan process.env.PORT (karenanya penggunaan const port = process.env.PORT || 8080).

    Catatan

    Anda akan menggunakan Azure App Service dalam latihan ini untuk memfasilitasi pengujian fungsionalitas Node.js Express. Kamu juga dapat melakukan kontainerisasi aplikasi dan menyebarkannya menggunakan Kubernetes dan AKS seperti yang ditunjukkan pada modul sebelumnya.

  8. Untuk mengizinkan skrip berjalan, gunakan editor kode untuk mengubah file package.json yang dibuat otomatis dengan mengganti konten yang sudah ada dengan konten berikut:

    {
      "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"
      }
    }
    

Menyambungkan aplikasi web Node.js Express ke Azure Database for PostgreSQL

Selanjutnya, Anda akan mengonfigurasi aplikasi web Node.js Express yang baru dibuat untuk menyambungkannya ke database cnainventory yang Anda buat di latihan sebelumnya modul ini. Untuk melakukan ini, Anda akan menggunakan Sequelize, yang merupakan pustaka JavaScript populer yang menyediakan fungsionalitas Pemeta Hubungan Objek, memungkinkan Anda untuk memetakan konstruksi terprogram ke dalam skema database yang sesuai.

  1. Dari komputer Anda, di jendela browser web yang menampilkan portal Microsoft Azure, dalam sesi Bash di panel Cloud Shell, jalankan perintah berikut untuk menambahkan Sequelize dan paket khusus PostgreSQL yang sesuai ke dalam proyek Anda:

    npm i sequelize pg pg-hstore
    
  2. Untuk memanfaatkan kemampuan baru ini, gunakan editor kode untuk menambahkan baris berikut ke awal file index.js:

    const Sequelize = require('sequelize')
    
  3. Untuk membuat koneksi ke database, Anda perlu menambahkan string koneksi dalam format khusus Sequalize ke file index.js mengikuti baris yang Anda tambahkan di langkah sebelumnya. Ganti tempat penampung <server_name> dengan nama server Azure Database for PostgreSQL yang Anda provisikan di latihan sebelumnya:

    const sequelize = new Sequelize('postgres://Student%40<server_name>:Pa55w0rd1234@<server_name>.postgres.database.azure.com:5432/cnainventory')
    

    Catatan

    Penggunaan %40 sebagai karakter escape antara nama pengguna dan nama server merupakan khusus untuk string koneksi untuk Azure Database for PostgreSQL.

  4. Dengan paket Sequelize yang disertakan sebagai persyaratan dan string koneksi dikonfigurasi, Anda sekarang dapat membuat koneksi ke database cnainventory dengan menambahkan kode berikut ke file index.js setelah yang Anda tambahkan di langkah sebelumnya:

    sequelize
    .authenticate()
    .then(() => {
       console.log('Connection has been established successfully.');
    })
    .catch(err => {
       console.error('Unable to connect to the database:', err);
    });
    
  5. Untuk memfasilitasi operasi pada tabel inventaris yang Anda buat di latihan sebelumnya, Anda perlu menambahkannya ke file index.js, setelah kode yang Anda tambahkan di langkah sebelumnya, definisi khusus Sequelize yang cocok dengan format tabel, seperti di bawah ini:

    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
    });
    

    Catatan

    Opsi timestamps: false ini diperlukan untuk mengecualikan dari lingkup operasi database sekumpulan kolom terkait waktu yang dalam hal ini, tidak ada. Opsi freezeTableName: true ini menonaktifkan perilaku default Sequelize yang secara otomatis mengubah semua nama model menjadi jamak.

Mengonfigurasikan Node.js Express untuk akses ke Azure Database for PostgreSQL

Sekarang Anda siap untuk mengonfigurasi rute yang akan menyediakan akses baca dan tulis ke tabel inventaris dalam database cnainventory yang di-hosting oleh server Azure Database for PostgreSQL. Untuk kesederhanaan, Anda hanya akan menerapkan dua rute, tetapi prosedur untuk mengonfigurasi rute lain akan sangat menyerupai implementasi yang akan Anda pindahkan dalam tugas ini. Rute pertama akan memungkinkan Anda untuk menambahkan item inventaris individual dengan memanggil permintaan HTTP POST dengan nilai item inventaris yang termasuk dalam badan permintaan, sementara rute kedua akan memproses permintaan HTTP GET, memberikan item inventaris berdasarkan nilai atribut id-nya.

  1. Dari komputer Anda, di jendela browser web yang menampilkan portal Microsoft Azure, dalam sesi Bash di panel Cloud Shell, gunakan editor kode untuk menambahkan konten berikut ke akhir file index.js:

    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)
    }})
    

    Catatan

    Bagian skrip ini mengelola permintaan HTTP POST, menambahkan baris ke tabel inventaris yang diisi dengan nilai atribut id, nama, dan kuantitas yang disertakan dalam badan permintaan. Nilai atribut tanggal dihitung secara otomatis berdasarkan tanggal saat ini. Operasi memberikan nilai yang baru ditambahkan sebagai konfirmasi keberhasilan operasi.

  2. Di editor kode, tambahkan konten berikut ke file index.js mengikuti skrip yang Anda tambahkan di langkah sebelumnya:

    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)
    }})
    

    Catatan

    Bagian skrip ini mengelola permintaan HTTP GET, memberikan nilai atribut id, nama, kuantitas, dan tanggal berdasarkan nilai id yang disertakan dalam permintaan.

    Catatan

    Ini menghasilkan skrip yang berfungsi penuh dalam format berikut (jika Anda berniat menyalin kode ini, pastikan untuk mengganti setiap kemunculan nama cnapostgresqldb dengan nama server PostgreSQL Anda):

    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)
    }})
    

Memvalidasi fungsionalitas layanan web Node.js Express

Anda akhirnya siap untuk menguji kegunaan layanan web Anda. Anda dapat melakukan kontainerisasi terhadapnya pada saat ini, tetapi demi kesederhanaan, Anda akan menyebarkannya ke Azure App Service. Ini akan memberikan cara cepat untuk memvalidasi kegunaannya dan memastikan bahwa mengkontainerkannya adalah opsi yang layak.

  1. Dalam jendela browser web yang menampilkan portal Microsoft Azure, dari sesi Bash di panel Cloud Shell, jalankan perintah berikut untuk membuat grup sumber daya yang akan meng-hosting aplikasi web Azure, ketika Anda akan menggunakan aplikasi Node.js Express:

    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. Jalankan perintah berikut untuk membuat paket Azure App Service tingkat gratis yang akan menghosting aplikasi web Azure baru:

    SPNAME=express-sp
    az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
    
  3. Jalankan perintah berikut untuk membuat aplikasi web Azure baru yang berbasis Node.js dan sebarkan kode ke dalamnya:

    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
    

    Catatan

    Saat dimintai kata sandi, ketik kata sandi yang ditampilkan mengikuti perintah echo $DEPLOYMENTPASS.

    Catatan

    Abaikan pesan yang menyatakan bahwa cabang master sudah ada atau tidak ada yang dilakukan.

  4. Jalankan perintah berikut untuk memvalidasi perutean POST HTTP dari aplikasi Node.js Express:

    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
    

    Catatan

    Perintah harus mengembalikan nilai entri baris tabel yang baru ditambahkan, termasuk tanggal yang dibuat secara otomatis. Mungkin perlu waktu satu hingga dua menit agar perintah menunjukkan nilai output.

  5. Untuk memvalidasi perutean GET HTTP dari aplikasi Node.js Express di browser web yang menampilkan panel Cloud Shell, buka tab lain, navigasi ke portal Microsoft Azure, lalu gunakan kotak teks Cari sumber daya, layanan, dan dokumen untuk mencari aplikasi web App Service yang Anda sebarkan. Navigasi ke panel Gambaran Umum, identifikasi nilai properti URL, tambahkan string /inventory/3 ke nilai URL tersebut, buka tab lain di jendela browser yang sama, lalu navigasi ke string URL yang baru dibangun untuk menampilkan halaman web yang sesuai.

    Catatan

    Halaman harus menampilkan properti item yang Anda tambahkan ke tabel inventaris dari database cnainventory di langkah sebelumnya.

Hasil

Selamat! Anda telah menyelesaikan latihan kedua modul ini. Dalam latihan ini, Anda membuat dan mengonfigurasi layanan web berbasis Express.js yang menyediakan akses ke Azure Database for PostgreSQL. Sumber daya yang Anda sebarkan dalam latihan ini akan diperlukan untuk berhasil menyelesaikan latihan berikutnya dalam modul ini.