Membuat API REST dengan Node.js dan Oracle Database. Bagian 3

Bagian 3. Membuat API REST: menangani permintaan GET


Pada artikel sebelumnya, Anda membuat koneksi ke database.

Dalam hal yang sama, tambahkan logika perutean, pengontrol, dan basis data untuk menangani permintaan GET HTTP ke titik akhir API "karyawan".

Menambahkan Logika Perutean


Ekspres dikirimkan bersama kelas Router , yang menyederhanakan perutean permintaan HTTP ke logika controller yang sesuai. Jalur rute menentukan titik akhir URL API dan mungkin berisi parameter rute yang menangkap nilai dalam URL.

Ada banyak cara untuk menentukan rute untuk aplikasi Anda. Misalnya, ketika aplikasi dimulai, Anda dapat membaca semua file di direktori controller dan secara otomatis menghasilkan logika perutean berdasarkan beberapa aturan yang telah ditentukan, seperti nama file dan properti yang mereka berikan. Atau, Anda dapat menambahkan file ke direktori konfigurasi dan membacanya saat startup.

Dalam aplikasi ini, Anda akan menggunakan pendekatan tingkat yang sedikit lebih rendah, menentukan rute secara terprogram melalui modul router baru. Buat file baru bernama router.js di direktori layanan . Tambahkan kode berikut ke file dan simpan perubahannya.

const express = require('express'); const router = new express.Router(); const employees = require('../controllers/employees.js'); router.route('/employees/:id?') .get(employees.get); module.exports = router; 

Modul router dimulai dengan meminta modul Express, dan kemudian membuat instance baru dari kelas Router Express. Metode rute dari modul router digunakan untuk menentukan rute berdasarkan data yang dikirimkan. Path menyertakan parameter opsional (karena tanda tanya) bernama id. Rute yang dikembalikan dari router memiliki metode yang cocok dengan metode HTTP dan memungkinkan penangan ditentukan. Dalam kasus ini, metode get digunakan untuk memetakan permintaan GET yang masuk ke fungsi get yang didefinisikan dalam pengontrol karyawan (yang akan dibuat di bawah).

Saat ini Anda memiliki router, tetapi tidak digunakan dalam aplikasi. Untuk menggunakannya, buka file layanan / web-server.js dan hapus baris di bagian atas, yang memerlukan modul basis data (hanya digunakan untuk pengujian pada posting sebelumnya ). Tambahkan baris kode berikut sebagai gantinya.

 // *** line that requires ../config/web-server.js is here *** const router = require('./router.js'); 

Kemudian gunakan kode berikut untuk mengganti seluruh penangan app.get, yang menanggapi permintaan GET menggunakan modul database (semua 7 baris).

 // *** line that adds morgan to app here *** // Mount the router at /api so all its routes start with /api app.use('/api', router); 

Sekarang router diminta dalam modul layanan web dan "dipasang" di / api. Ini berarti bahwa URL lengkap untuk titik akhir karyawan adalah http: // server: port / api / employee /: id.

Menambahkan Logika Pengendali


Logika pengontrol akan mulai beroperasi sejak URL titik akhir dan metode HTTP diketahui. Karena server web dibangun menggunakan Express, logika pengontrol akan ditentukan menggunakan middleware khusus atau fungsi yang memiliki akses ke objek permintaan dan respons, serta ke fungsi berikutnya.

Fungsi middleware akan menggunakan input dari objek permintaan untuk menghasilkan respons yang dikirim ke objek respons. Fungsi selanjutnya biasanya digunakan untuk memanggil fungsi middleware berikutnya dalam pipeline. Namun, dalam API ini, logika pengontrol akan menjadi langkah terakhir dalam pipa dan menyelesaikan respons HTTP. Fungsi berikutnya hanya akan dipanggil jika terjadi kesalahan yang melewati kontrol ke penangan kesalahan Express standar.

Pergi ke direktori controllers dan buat file baru bernama employee.js . Salin dan tempel kode berikut ke dalam file dan simpan perubahannya.

 /*01*/const employees = require('../db_apis/employees.js'); /*02*/ /*03*/async function get(req, res, next) { /*04*/ try { /*05*/ const context = {}; /*06*/ /*07*/ context.id = parseInt(req.params.id, 10); /*08*/ /*09*/ const rows = await employees.find(context); /*10*/ /*11*/ if (req.params.id) { /*12*/ if (rows.length === 1) { /*13*/ res.status(200).json(rows[0]); /*14*/ } else { /*15*/ res.status(404).end(); /*16*/ } /*17*/ } else { /*18*/ res.status(200).json(rows); /*19*/ } /*20*/ } catch (err) { /*21*/ next(err); /*22*/ } /*23*/} /*24*/ /*25*/module.exports.get = get; 

Baris 1: API Database Karyawan (dibuat di bawah).
Baris 3-23: Fungsi asinkron bernama get dideklarasikan. Blok try-catch digunakan dalam fungsi tubuh untuk menangkap pengecualian yang dilemparkan ke utas utama dan meneruskannya ke fungsi berikutnya.
Baris 5-7: konstanta dengan konteks bernama dideklarasikan - ini adalah objek universal yang akan berisi properti yang terkait dengan metode pencarian API basis data. Properti id ditambahkan ke konteks berdasarkan pada nilai yang datang melalui req.params.id.
Baris 9: Metode menemukan digunakan untuk mengambil catatan karyawan yang sesuai dalam database.
Baris 11-19: Logika bersyarat digunakan untuk menentukan kode status HTTP dan badan respons yang benar. Jika satu karyawan diminta tetapi tidak ditemukan, kode kesalahan "404 Tidak Ditemukan" dikirim sebagai tanggapan. Jika tidak, kode "200 OK" dikirim bersama dengan badan respons berbasis JSON.
Baris 25: ekspor modul sehingga Anda dapat menambahkan ke modul lain

Objek req.params hanyalah salah satu dari beberapa properti yang digunakan untuk mendapatkan data dari objek permintaan yang masuk . Properti umum lainnya termasuk req.query untuk nilai string kueri di URL, req.body untuk badan permintaan, dan req.cookies. Header HTTP dapat diperoleh dengan menggunakan metode req.get.

Menambahkan Logika Basis Data


Untuk memulai modul database karyawan, buka direktori db_apis dan buat file baru bernama employee.js . Tambahkan kode berikut ke file.

 const database = require('../services/database.js'); const baseQuery = `select employee_id "id", first_name "first_name", last_name "last_name", email "email", phone_number "phone_number", hire_date "hire_date", job_id "job_id", salary "salary", commission_pct "commission_pct", manager_id "manager_id", department_id "department_id" from employees`; async function find(context) { let query = baseQuery; const binds = {}; if (context.id) { binds.employee_id = context.id; query += `\nwhere employee_id = :employee_id`; } const result = await database.simpleExecute(query, binds); return result.rows; } module.exports.find = find; 

Modul basis data karyawan memperkenalkan modul basis data umum dan menginisialisasi baseQuery bernama konstan untuk kueri SQL di tabel karyawan. Alias ​​kolom dikutip ganda digunakan untuk mengontrol kasus kunci dikembalikan.

Kemudian fungsi bernama find dideklarasikan, yang digunakan untuk mengeksekusi query dan mengembalikan baris yang diekstraksi. Jika parameter konteks yang diteruskan memiliki nilai id sebenarnya, maka klausa tempat ditambahkan ke permintaan, jadi hanya satu karyawan yang dikembalikan.

Perhatikan bahwa nilai context.id tidak ditambahkan ke permintaan secara langsung. Alih-alih, placeholder bernama: employee_id digunakan - ini disebut variabel terikat . Menggunakan variabel pengikat basis data Oracle sangat penting dalam hal keamanan dan kinerja. Nilai variabel bind ditugaskan ke objek bind, yang diteruskan bersama dengan query ke database.simpleExecute. Akhirnya, baris yang diambil dari database dikembalikan ke pemanggil.

Buka aplikasi dan buka browser di http: // localhost: 3000 / api / karyawan. Anda harus melihat daftar karyawan sebagai berikut (Saya pingsan pasangan):
gambar
Anda dapat memilih satu karyawan dengan menambahkan pengenal ke akhir URL, misalnya: http: // localhost: 3000 / api / employee / 100.

gambar

Pada titik ini, API Anda dapat menangani permintaan GET di titik akhir karyawan. Di posting berikutnya, Anda akan memperluas fungsionalitas CRUD dengan menambahkan logika yang memproses permintaan POST, PUT, dan DELETE.

Source: https://habr.com/ru/post/id473350/


All Articles