Membangun REST API Dengan Node.js dan Express:Menghubungkan Database
Dalam tutorial pertama, Memahami RESTful API, kita mempelajari apa itu arsitektur REST, apa metode dan respons permintaan HTTP, dan bagaimana memahami titik akhir RESTful API. Dalam tutorial kedua, Cara Mengatur Server API Ekspres, kita mempelajari cara membangun server dengan http
bawaan Node. modul dan kerangka kerja Express, dan cara mengarahkan aplikasi yang kita buat ke titik akhir URL yang berbeda.
Saat ini, kami menggunakan data statis untuk menampilkan informasi pengguna dalam bentuk umpan JSON ketika titik akhir API dipukul dengan GET
meminta. Dalam tutorial ini, kita akan menyiapkan database MySQL untuk menyimpan semua data, menghubungkan ke database dari aplikasi Node.js kita, dan mengizinkan API untuk menggunakan GET
, POST
, PUT
, dan DELETE
metode untuk membuat API lengkap.
Pemasangan
Sampai saat ini, kami belum menggunakan database untuk menyimpan atau memanipulasi data apa pun, jadi kami akan menyiapkannya. Tutorial ini akan menggunakan MySQL, dan jika Anda sudah menginstal MySQL di komputer Anda, Anda siap untuk melanjutkan ke langkah berikutnya.
Jika Anda belum menginstal MySQL, Anda dapat mengunduh MAMP untuk macOS dan Windows, yang menyediakan lingkungan dan database server lokal gratis. Setelah Anda mengunduh ini, buka program dan klik Mulai Server untuk memulai MySQL.
Selain menyiapkan MySQL itu sendiri, kami ingin perangkat lunak GUI untuk melihat database dan tabel. Untuk Mac, unduh SequelPro, dan untuk Windows unduh SQLyog. Setelah MySQL diunduh dan dijalankan, Anda dapat menggunakan SequelPro atau SQLyog untuk terhubung ke localhost
dengan nama pengguna root
dan kata sandi root
pada port 3306
.
Setelah semuanya diatur di sini, kita dapat melanjutkan ke pengaturan database untuk API kita.
Menyiapkan Basis Data
Dalam perangkat lunak tampilan database Anda, tambahkan database baru dan beri nama api
. Pastikan MySQL berjalan, atau Anda tidak akan dapat terhubung ke localhost
.
Ketika Anda memiliki api
database dibuat, pindah ke dalamnya dan jalankan kueri berikut untuk membuat tabel baru.
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT '', `email` varchar(50) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Kueri SQL ini akan membuat struktur users
meja. Setiap pengguna akan memiliki id yang bertambah secara otomatis, nama, dan alamat email.
Kami juga dapat mengisi database dengan data yang sama yang sedang kami tampilkan melalui array JSON statis dengan menjalankan INSERT
kueri.
INSERT INTO users (name, email) VALUES ('Richard Hendricks', '[email protected]'), ('Bertram Gilfoyle', '[email protected]');
Tidak perlu memasukkan id
bidang, karena bertambah secara otomatis. Pada titik ini, kami memiliki struktur tabel kami serta beberapa data sampel untuk digunakan.
Menghubungkan ke MySQL
Kembali ke aplikasi kita, kita harus terhubung ke MySQL dari Node.js untuk mulai bekerja dengan data. Sebelumnya, kami menginstal mysql
modul npm, dan sekarang kita akan menggunakannya.
Buat direktori baru bernama data dan buat config.js berkas.
Kita akan mulai dengan meminta mysql
modul di data/config.js .
const mysql = require('mysql');
Mari kita buat config
objek yang berisi host, user, password, dan database. Ini harus merujuk ke api
database yang kami buat dan menggunakan pengaturan localhost default.
// Set database connection credentials const config = { host: 'localhost', user: 'root', password: 'root', database: 'api', };
Untuk efisiensi, kita akan membuat kumpulan MySQL, yang memungkinkan kita menggunakan beberapa koneksi sekaligus daripada harus membuka dan menutup beberapa koneksi secara manual.
// Create a MySQL pool const pool = mysql.createPool(config);
Terakhir, kami akan mengekspor kumpulan MySQL agar aplikasi dapat menggunakannya.
// Export the pool module.exports = pool;
Anda dapat melihat file konfigurasi database yang telah selesai di repo GitHub kami.
Sekarang kita terhubung ke MySQL dan pengaturan kita selesai, kita dapat beralih ke interaksi dengan database dari API.
Mendapatkan Data API Dari MySQL
Saat ini, routes.js
our kami file secara manual membuat larik pengguna JSON, yang terlihat seperti ini.
const users = [{ ...
Karena kita tidak akan lagi menggunakan data statis, kita dapat menghapus seluruh larik tersebut dan menggantinya dengan tautan ke kumpulan MySQL.
// Load the MySQL pool connection const pool = require('../data/config');
Sebelumnya, GET
untuk /users
path mengirim users
static statis data. Kode kami yang diperbarui akan menanyakan database untuk data itu sebagai gantinya. Kami akan menggunakan kueri SQL untuk SELECT
semua dari users
tabel, yang terlihat seperti ini.
SELECT * FROM users
Inilah /users
baru kami get route akan terlihat seperti, menggunakan pool.query()
metode.
// Display all users app.get('/users', (request, response) => { pool.query('SELECT * FROM users', (error, result) => { if (error) throw error; response.send(result); }); });
Di sini, kami menjalankan SELECT
kueri dan kemudian mengirimkan hasilnya sebagai JSON ke klien melalui /users
titik akhir. Jika Anda me-restart server dan menavigasi ke /users
halaman, Anda akan melihat data yang sama seperti sebelumnya, tetapi sekarang dinamis.
Menggunakan Parameter URL
Sejauh ini, titik akhir kami adalah jalur statis—baik /
root atau /users
—tetapi bagaimana jika kita hanya ingin melihat data tentang pengguna tertentu? Kita harus menggunakan titik akhir variabel.
Untuk pengguna kami, kami mungkin ingin mengambil informasi tentang setiap pengguna individu berdasarkan id unik mereka. Untuk melakukannya, kita akan menggunakan titik dua (:
) untuk menunjukkan bahwa itu adalah parameter rute.
// Display a single user by ID app.get('/users/:id', (request, response) => { ... }); });
Kami dapat mengambil parameter untuk jalur ini dengan request.params
Properti. Karena milik kita bernama id
, begitulah cara kami merujuknya.
const id = request.params.id;
Sekarang kita akan menambahkan WHERE
klausa ke SELECT
. kami pernyataan untuk hanya mendapatkan hasil yang memiliki id
yang ditentukan .
Kami akan menggunakan ?
sebagai pengganti untuk menghindari injeksi SQL dan meneruskan id sebagai parameter, alih-alih membuat string gabungan, yang akan kurang aman.
pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send(result); });
Kode lengkap untuk sumber daya pengguna individual kami sekarang terlihat seperti ini:
// Display a single user by ID app.get('/users/:id', (request, response) => { const id = request.params.id; pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send(result); }); });
Sekarang Anda dapat memulai ulang server dan membuka https://localhost/users/2
untuk melihat hanya informasi untuk Gilfoyle. Jika Anda mendapatkan kesalahan seperti Cannot GET /users/2
, itu berarti Anda harus me-restart server.
Membuka URL ini akan mengembalikan satu hasil.
[{ id: 2, name: "Bertram Gilfoyle", email: "[email protected]" }]
Jika itu yang Anda lihat, selamat:Anda telah berhasil menyiapkan parameter rute dinamis!
Mengirim Permintaan POST
Sejauh ini, semua yang kami lakukan telah menggunakan GET
permintaan. Permintaan ini aman, artinya tidak mengubah status server. Kami baru saja melihat data JSON.
Sekarang kita akan mulai membuat API benar-benar dinamis dengan menggunakan POST
permintaan untuk menambahkan data baru.
Saya sebutkan sebelumnya di artikel Memahami REST bahwa kami tidak menggunakan kata kerja seperti add
atau delete
di URL untuk melakukan tindakan. Untuk menambahkan pengguna baru ke database, kita akan POST
ke URL yang sama tempat kita melihatnya, tetapi cukup siapkan rute terpisah untuk itu.
// Add a new user app.post('/users', (request, response) => { ... });
Perhatikan bahwa kami menggunakan app.post()
bukannya app.get()
sekarang.
Karena kami membuat alih-alih membaca, kami akan menggunakan INSERT
query di sini, seperti yang kita lakukan pada inisialisasi database. Kami akan mengirimkan seluruh request.body
melalui kueri SQL.
pool.query('INSERT INTO users SET ?', request.body, (error, result) => { if (error) throw error;
Kami juga akan menentukan status respons sebagai 201
, yang merupakan singkatan dari Created
. Untuk mendapatkan id dari item yang terakhir dimasukkan, kita akan menggunakan insertId
properti.
response.status(201).send(`User added with ID: ${result.insertId}`);
Seluruh POST
Our kami menerima kode akan terlihat seperti ini.
// Add a new user app.post('/users', (request, response) => { pool.query('INSERT INTO users SET ?', request.body, (error, result) => { if (error) throw error; response.status(201).send(`User added with ID: ${result.insertId}`); }); });
Sekarang kami dapat mengirim POST
permintaan melalui. Sebagian besar waktu ketika Anda mengirim POST
permintaan, Anda melakukannya melalui formulir web. Kita akan mempelajari cara menyiapkannya di akhir artikel ini, tetapi cara tercepat dan termudah untuk mengirim POST
pengujian adalah dengan cURL, menggunakan -d (--data)
bendera.
Kami akan menjalankan curl -d
, diikuti oleh string kueri yang berisi semua pasangan kunci/nilai dan titik akhir permintaan.
curl -d "name=Dinesh Chugtai&[email protected]" http://localhost:3002/users
Setelah Anda mengirimkan permintaan ini, Anda akan mendapatkan tanggapan dari server.
User added with ID: 3
Jika Anda menavigasi ke http://localhost/users
, Anda akan melihat entri terbaru ditambahkan ke daftar.
Mengirim Permintaan PUT
POST
berguna untuk menambahkan pengguna baru, tetapi kami ingin menggunakan PUT
untuk mengubah pengguna yang ada. PUT
adalah idempoten, artinya Anda dapat mengirim permintaan yang sama beberapa kali dan hanya satu tindakan yang akan dilakukan. Ini berbeda dari POST
, karena jika kami mengirimkan permintaan pengguna baru kami lebih dari sekali, itu akan terus membuat pengguna baru.
Untuk API kami, kami akan menyiapkan PUT
untuk dapat menangani pengeditan satu pengguna, jadi kita akan menggunakan :id
parameter rute kali ini.
Mari kita buat UPDATE
kueri dan pastikan itu hanya berlaku untuk id yang diminta dengan WHERE
ayat. Kami menggunakan dua ?
placeholder, dan nilai yang kami berikan akan masuk secara berurutan.
// Update an existing user app.put('/users/:id', (request, response) => { const id = request.params.id; pool.query('UPDATE users SET ? WHERE id = ?', [request.body, id], (error, result) => { if (error) throw error; response.send('User updated successfully.'); }); });
Untuk pengujian kami, kami akan mengedit pengguna 2
dan perbarui alamat email dari [email protected] ke [email protected]. Kita dapat menggunakan cURL lagi, dengan [-X (--request)]
bendera, untuk secara eksplisit menentukan bahwa kami mengirim permintaan PUT.
curl -X PUT -d "name=Bertram Gilfoyle" -d "[email protected]" http://localhost:3002/users/2
Pastikan untuk me-restart server sebelum mengirim permintaan, atau Anda akan mendapatkan kode Cannot PUT /users/2
kesalahan.
Anda akan melihat ini:
User updated successfully.
Data pengguna dengan id 2
sekarang harus diperbarui.
Mengirim Permintaan DELETE
Tugas terakhir kami untuk menyelesaikan fungsionalitas CRUD API adalah membuat opsi untuk menghapus pengguna dari database. Permintaan ini akan menggunakan DELETE
Kueri SQL dengan WHERE
, dan itu akan menghapus pengguna individu yang ditentukan oleh parameter rute.
// Delete a user app.delete('/users/:id', (request, response) => { const id = request.params.id; pool.query('DELETE FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send('User deleted.'); }); });
Kita dapat menggunakan -X
lagi dengan cURL untuk mengirim penghapusan. Mari kita hapus pengguna terbaru yang kita buat.
curl -X DELETE http://localhost:3002/users/3
Anda akan melihat pesan sukses.
User deleted.
Arahkan ke http://localhost:3002
, dan Anda akan melihat bahwa hanya ada dua pengguna sekarang.
Selamat! Pada titik ini, API selesai. Kunjungi repo GitHub untuk melihat kode lengkap routes.js .
Mengirim Permintaan Melalui request
Modul
Di awal artikel ini, kami memasang empat dependensi, dan salah satunya adalah request
modul. Alih-alih menggunakan permintaan cURL, Anda dapat membuat file baru dengan semua data dan mengirimkannya. Saya akan membuat file bernama post.js yang akan membuat pengguna baru melalui POST
.
const request = require('request'); const json = { "name": "Dinesh Chugtai", "email": "[email protected]", }; request.post({ url: 'http://localhost:3002/users', body: json, json: true, }, function (error, response, body) { console.log(body); });
Kita dapat memanggil ini menggunakan node post.js
di jendela terminal baru saat server sedang berjalan, dan itu akan memiliki efek yang sama seperti menggunakan cURL. Jika ada yang tidak berfungsi dengan cURL, request
modul berguna karena kita dapat melihat kesalahan, respons, dan isi.
Mengirim Permintaan Melalui Formulir Web
Biasanya, POST
dan metode HTTP lain yang mengubah status server dikirim menggunakan formulir HTML. Dalam contoh yang sangat sederhana ini, kita dapat membuat index.html file di mana saja, dan buat bidang untuk nama dan alamat email. Tindakan formulir akan mengarah ke sumber daya, dalam hal ini http//localhost:3002/users
, dan kita akan menentukan metodenya sebagai post
.
Buat index.html dan tambahkan kode berikut ke dalamnya:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Node.js Express REST API</title> </head> <body> <form action="http://localhost:3002/users" method="post"> <label for="name">Name</label> <input type="text" name="name"> <label for="email">Email</label> <input type="email" name="email"> <input type="submit"> </form> </body> </html>
Buka file HTML statis ini di browser Anda, isi, dan kirimkan saat server sedang berjalan di terminal. Anda akan melihat respon dari User added with ID: 4
, dan Anda akan dapat melihat daftar pengguna baru.