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

Bagian 2: Membuat API REST: Dasar-Dasar Database


Pada artikel pertama, Anda membuat server web, di sini Anda akan membuat modul yang bertanggung jawab untuk memulai dan mematikan kumpulan koneksi database menggunakan node-oracledb . Dan tambahkan fitur yang menyederhanakan pelaksanaan pernyataan sederhana dengan secara otomatis mendapatkan dan melepaskan koneksi dari kumpulan.

Menjalankan pool koneksi


Karena node-oracledb dibangun di atas pustaka klien OCI, ia memiliki dukungan bawaan untuk membuat kumpulan OCI yang sisi-klien dan memiliki karakteristik kinerja yang sangat baik. Untuk membuat kumpulan koneksi, mulailah dengan membuat file konfigurasi baru bernama database.js di direktori config . Salin dan tempel kode berikut ke dalam file dan simpan perubahannya.

module.exports = { hrPool: { user: process.env.HR_USER, password: process.env.HR_PASSWORD, connectString: process.env.HR_CONNECTIONSTRING, poolMin: 10, poolMax: 10, poolIncrement: 0 } }; 

Seperti file config / webserver.js , file ini memungkinkan Anda untuk mengatur beberapa properti menggunakan variabel lingkungan. Menggunakan variabel lingkungan memberikan fleksibilitas ketika menggunakan aplikasi di lingkungan yang berbeda dan membantu untuk menyimpan kata sandi dan informasi sensitif lainnya di luar kode sumber. Jalankan perintah berikut dari terminal untuk mengatur variabel lingkungan yang diperlukan dan pastikan bahwa mereka tersedia di sesi terminal mendatang.

 echo "export HR_USER=hr" >> ~/.bashrc echo "export HR_PASSWORD=oracle" >> ~/.bashrc echo "export HR_CONNECTIONSTRING=0.0.0.0/orcl" >> ~/.bashrc source ~/.bashrc 

Anda mungkin memperhatikan bahwa poolMin dan poolMax sama dan poolIncrement ditetapkan ke 0. Ini akan membuat kolam ukuran tetap yang membutuhkan lebih sedikit sumber daya manajemen - ide bagus untuk kolam yang mendapatkan penggunaan yang konsisten.

Meskipun Node.js sering digambarkan sebagai "single-threaded", ia memiliki kumpulan thread yang tersedia untuk operasi tertentu yang jika tidak akan memblokir utas utama yang menjalankan kode JavaScript. Kumpulan utas ini digunakan oleh node-oracledb untuk melakukan semua operasi asinkronnya, seperti menerima koneksi dan mengeksekusi kode SQL dan PL / SQL. Namun, ukuran kumpulan utas standar adalah 4. Jika Anda ingin semua 10 koneksi dalam kumpulan berfungsi secara bersamaan, Anda perlu menambah jumlah utas.

Variabel lingkungan UV_THREADPOOL_SIZE dapat digunakan untuk menyesuaikan ukuran kumpulan utas. UV_THREADPOOL_SIZE dapat diatur sebelum menjalankan aplikasi Node.js atau secara internal, tetapi harus diatur sebelum panggilan pertama dilakukan menggunakan kumpulan utas. Ini karena fakta bahwa kumpulan thread dibuat pada penggunaan pertama dan setelah penciptaannya, ukurannya tetap. Buka file index.js di root aplikasi dan tambahkan baris berikut setelah baris pertama (yang berisi modul server web).

 // *** line that requires services/web-server.js is here *** const dbConfig = require('./config/database.js'); const defaultThreadPoolSize = 4; // Increase thread pool size by poolMax process.env.UV_THREADPOOL_SIZE = dbConfig.hrPool.poolMax + defaultThreadPoolSize; 

Sekarang setelah kumpulan thread memiliki ukuran yang sesuai, Anda dapat pergi ke modul database. Buat file baru di direktori layanan bernama database.js . Salin dan tempel kode berikut ke dalamnya dan simpan perubahannya.
 const oracledb = require('oracledb'); const dbConfig = require('../config/database.js'); async function initialize() { const pool = await oracledb.createPool(dbConfig.hrPool); } module.exports.initialize = initialize; 

Modul ini pertama-tama memperkenalkan node-oracledb dan file konfigurasi. Kemudian fungsi asinkron didefinisikan dengan nama inisialisasi, yang kemudian disediakan melalui objek module.exports. Fungsi inisialisasi membuat kumpulan koneksi, yang disimpan dalam cache internal kumpulan koneksi sebagai kumpulan standar.

Sekarang Anda perlu menghubungkan semuanya sehingga kumpulan koneksi dimulai sebelum server web terbuka. Kembali ke index.js dan tambahkan baris berikut di bawah baris 1.
 // *** line that requires services/web-server.js is here *** const database = require('./services/database.js'); 

Kemudian tambahkan blok coba berikut ke fungsi stratup, tepat sebelum blok coba yang ada yang memulai server web.

 try { console.log('Initializing database module'); await database.initialize(); } catch (err) { console.error(err); process.exit(1); // Non-zero failure code } // *** existing try block in startup here *** 

Pada titik ini, Anda dapat menginstal node-oracledb dan menguji kodenya. Jalankan perintah berikut di terminal dari direktori hr_app.

 npm install oracledb -s node . 

Jika Anda melihat pesan bahwa modul database dan server web sedang berjalan, maka, selamat - kumpulan koneksi Anda sekarang berfungsi!

Kolam koneksi shutdown


Jika Anda menutup aplikasi sekarang (menggunakan ctrl + c, seperti sebelumnya), proses Node.js akan dimusnahkan sebelum kumpulan koneksi ditutup. Meskipun semua proses database terkait harus dibersihkan secara otomatis, yang terbaik adalah secara eksplisit menutup kumpulan koneksi sebelum keluar dari proses Node.js.

Kembali ke file layanan / database.js , tambahkan baris kode berikut ke akhir, dan simpan pembaruan.

 // *** previous code above this line *** async function close() { await oracledb.getPool().close(); } module.exports.close = close; 

Fungsi tutup menggunakan metode oracledb.getPool () untuk mendapatkan kumpulan default secara sinkron, dan kemudian memanggil metode tutup pada kumpulan untuk menutupnya.

Untuk memanggil fungsi tutup pada waktu yang tepat, tambahkan baris kode berikut ke file index.js di dalam fungsi shutdown segera setelah blok coba yang ada yang menghentikan server web.

 // *** existing try-catch block in shutdown here *** try { console.log('Closing database module'); await database.close(); } catch (err) { console.log('Encountered error', e); err = err || e; } 

Jika Anda memulai dan menutup aplikasi lagi, Anda akan melihat bahwa modul database ditutup setelah menutup server web, tetapi sebelum proses selesai.

Sederhanakan Operasi CRUD Sederhana


Menjalankan kode SQL atau PL / SQL menggunakan node-oracledb biasanya merupakan proses tiga langkah: dapatkan koneksi, jalankan kode, dan kemudian lepaskan koneksi. Jika semua yang ingin Anda lakukan adalah melakukan satu panggilan untuk mengeksekusi (tidak ada transaksi multi-langkah diperlukan), maka menerima dan melepaskan koneksi mungkin terlihat seperti kode standar. Saya suka membuat fungsi yang melakukan ketiga operasi dalam satu panggilan. Kembali ke file services / database.js , tambahkan kode berikut di bawah ini dan simpan perubahannya.

 // *** previous code above this line *** function simpleExecute(statement, binds = [], opts = {}) { return new Promise(async (resolve, reject) => { let conn; opts.outFormat = oracledb.OBJECT; opts.autoCommit = true; try { conn = await oracledb.getConnection(); const result = await conn.execute(statement, binds, opts); resolve(result); } catch (err) { reject(err); } finally { if (conn) { // conn assignment worked, need to close try { await conn.close(); } catch (err) { console.log(err); } } } }); } module.exports.simpleExecute = simpleExecute; 

Biasanya, Anda tidak akan menggunakan modul database dalam modul server web, tetapi tambahkan sekarang untuk memverifikasi bahwa ia berfungsi dengan benar. Buka file services / web-server.js dan tambahkan baris berikut di bawah deklarasi konstan yang ada di atas.

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

Kemudian gunakan kode berikut untuk mengganti seluruh penangan app.get yang merespons dengan "Hello World!" (Semua 3 baris).

 // *** line that adds morgan to app here *** app.get('/', async (req, res) => { const result = await database.simpleExecute('select user, systimestamp from dual'); const user = result.rows[0].USER; const date = result.rows[0].SYSTIMESTAMP; res.end(`DB user: ${user}\nDate: ${date}`); }); 

Handler baru menggunakan fungsi simpleExecute dari modul database untuk mengambil nilai-nilai pengguna saat ini dan systimestamp dari database. Nilai-nilai ini kemudian digunakan dalam templat literal untuk menanggapi klien dengan pesan dinamis.

Luncurkan aplikasi lagi dan pergi ke localhost: 3000. Anda akan melihat sesuatu seperti gambar berikut.

gambar

Jika Anda melihat pesan ini, maka semuanya berfungsi sebagaimana mestinya. Di artikel berikutnya, Anda akan terus membuat API dengan menambahkan logika perutean, pengontrol, dan basis data untuk permintaan GET.

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


All Articles