Di sini saya akan menunjukkan cara membuat contoh REST API CRUD menggunakan Nodejs Express dan server MySQL. CRUD berarti operasi Buat, Baca, Perbarui, dan Hapus yang dilakukan melalui sumber daya REST (Representational State Transfer) yang bekerja pada protokol http/https
Sumber daya atau API REST bekerja pada kata kerja, seperti, GET, POST, PUT, DELETE, dll. Jadi jelas bahwa GET berarti Anda perlu mengambil data dari titik akhir server, POST berarti Anda perlu membuat sumber daya baru di titik akhir server, PUT berarti Anda perlu memperbarui sumber daya yang ada di server dan DELETE berarti Anda perlu menghapus sumber daya di
Meskipun Anda memiliki arti kata kerja untuk bekerja dengan sumber daya REST tetapi sekali lagi tergantung pada implementasi di sisi server. Jadi misalnya, untuk mengambil data dari server Anda bisa menggunakan kata kerja POST. Jadi untuk membuat sumber daya baru Anda juga dapat menggunakan kata kerja GET, tetapi ingat apakah Anda harus benar-benar menggunakan parameter badan permintaan pada titik akhir GET
Di sini saya akan menggunakan Nodejs dan Express untuk membuat titik akhir REST dengan MySQL sebagai sistem persisten untuk menyimpan data
Prasyarat
Nodejs v12. 18. 3, npm6. 14. 6, Ekspres 4. 17. 1, MySQL8. 0. 17
Pengaturan Proyek
Pilih direktori root proyek Anda, katakanlah, nama direktori tersebut adalah nodejs_mysql_rest_api_crud. Saya mungkin tidak menyebutkan nama direktori root proyek ini tetapi saya berasumsi bahwa saya akan membuat file atau folder apa pun sehubungan dengan direktori root proyek ini
Sekarang jalankan perintah npm init di direktori root proyek Anda. Perintah ini akan membuat paket. json dengan informasi dasar, seperti nama aplikasi, deskripsi, versi, penulis, lisensi, dependensi apa pun, dll
Selanjutnya Anda perlu menjalankan perintah npm install dan perintah ini akan membuat file package-lock. json di mana Anda akan menemukan semua detail dependensi Anda. Ketergantungan ini diunduh ke folder node_modules di bawah direktori root proyek Anda
Selanjutnya adalah menginstal Express menggunakan perintah npm install express dengan cara yang sama seperti Anda menjalankan dua perintah lainnya di atas
Anda perlu menginstal driver mysql juga untuk terhubung ke server MySQL Anda dengan menjalankan perintah berikut
npm install mysqlNah, Anda sudah selesai dengan penyiapan proyek. Sekarang mari beralih ke bagian implementasi
Sumber Daya CRUD
Sekarang saya akan mengimplementasikan operasi CRUD menggunakan sumber daya REST. Saya akan memisahkan layer menjadi file yang berbeda
Untuk operasi basis data saya akan membuat file model, untuk menangani permintaan / respons klien saya akan membuat file pengontrol, untuk menangani rute saya akan membuat file rute, untuk membuat konfigurasi server dan server saya akan membuat file aplikasi, untuk konfigurasi basis data saya akan membuat konfigurasi db
Konfigurasi Basis Data
Mari kita mulai dengan konfigurasi basis data. Buat file bernama db. js di bawah folder config untuk membuat koneksi database. Pastikan untuk mengubah pengaturan database sesuai dengan milik Anda
Dalam file ini saya telah mendefinisikan objek Item kemudian melakukan operasi CRUD yang diperlukan. Saya mengambil catatan berdasarkan id atau nama yang diberikan. Saya juga mengambil semua catatan dari database. Operasi tulis lainnya seperti buat/simpan, perbarui dan hapus juga dilakukan
'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_Tabel MySQL dan contoh data diberikan di bawah ini yang akan saya gunakan untuk aplikasi ini
Konfigurasi Server
Titik masuk untuk aplikasi Nodejs adalah index. js yang dapat Anda temukan di package.js. file json. Jadi, Anda dapat menulis kode Anda di index. js atau Anda dapat menulis file lain. Saya akan menulis ke dalam file bernama app. js. Pastikan untuk memperbarui paket Anda. file json dengan nama file baru Anda
Aplikasi. File js memiliki kode berikut
var mysql = require('mysql'); var express = require('express'); var bodyParser = require('body-parser'); var app = express(); var server = require('http').Server(app); var port = process.env.PORT || 4000; // to support JSON-encoded bodies app.use(bodyParser.json()) // to support URL-encoded bodies app.use(bodyParser.urlencoded({ extended: true })) // Require item routes const routes = require('./src/route/item.route') // using as middleware app.use('/item', routes) // root path app.get("/", (req, res, next) => { res.json("What's up?"); }); server.listen(port, () => { console.log('Listening on port: ' + port); });Baris pertama membutuhkan mysql dan menggunakan variabel mysql untuk mewakilinya. Baris kedua membutuhkan express dan menggunakan variabel express untuk mewakilinya. Baris ketiga membutuhkan body-parser dan menggunakan variabel bodyParser untuk mewakilinya. Baris keempat menginisialisasi server ekspres dan menempatkan server yang diinisialisasi ke dalam aplikasi variabel
Nodejs memiliki modul bawaan yang disebut HTTP, yang memungkinkan Nodejs untuk mentransfer data melalui Hyper Text Transfer Protocol (HTTP). Untuk menyertakan modul HTTP, gunakan metode require(). 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_0
Selanjutnya jika ada port yang ditentukan melalui variabel lingkungan PORT kemudian gunakan atau secara default gunakan port 4000
Kemudian atur aplikasi Anda untuk mendengarkan port 4000 dan buat fungsi panggilan balik yang mengatakan bahwa server Anda berjalan di port 4000 atau lebih
Saya telah mengatur bodyParser untuk menangani tipe konten json dan application/x-www-form-urlencoded
Saya telah menentukan jalur root untuk aplikasi ini. Saya juga telah menggunakan rute dan saya akan memberi tahu Anda nanti tentang hal ini ketika saya akan membuat rute untuk aplikasi ini
Aplikasi Anda sekarang dapat diakses di http. // localhost. 4000, dan mencapai titik akhir itu memberi Anda hasil berikut
Model
Saya akan membuat model untuk melakukan operasi basis data. Buat item file. model. js di bawah folder model
'use strict'; var con = require('./../../config/db'); // Item Object var Item = function(item){ this.item_id = item.item_id; this.item_name = item.item_name; this.item_desc = item.item_desc; this.item_price = item.item_price; }; // Define CRUD Operations Functions Item.findById = function (id, result) { let sql = 'SELECT * FROM items WHERE item_id = ?'; con.query(sql, id, (err, row, fields) => { console.log("error: ", err); if (err) result(err, null); console.log(row); result(null, row); }); }; Item.findByName = function (name, result) { let sql = 'SELECT * FROM items WHERE item_name = ?'; con.query(sql, name, (err, rows, fields) => { console.log("error: ", err); if (err) result(err, null); console.log('rows: ', rows); result(null, rows); }); }; Item.findAll = function (result) { let sql = 'SELECT * FROM items'; con.query(sql, (err, rows, fields) => { console.log("error: ", err); if (err) result(err, null); console.log(rows); result(null, rows); }); }; Item.create = function (newItem, result) { let data = [newItem.item_name, newItem.item_desc, newItem.item_price]; let sql = 'INSERT INTO items(item_name, item_desc, item_price) VALUES(?, ?, ?)'; con.query(sql, data, (err, row, fields) => { console.log("error: ", err); if (err) result(err, null); console.log(row.insertId); result(null, row.insertId); }); }; Item.update = function(item, result){ let data = [item.item_name, item.item_desc, item.item_price, item.item_id]; let sql = 'UPDATE items SET item_name = ?, item_desc = ?, item_price = ? WHERE item_id = ?'; con.query(sql, data, (err, row, fields) => { console.log("error: ", err); if (err) result(err, null); console.log(row.affectedRows); result(null, row.affectedRows); }); }; Item.delete = function(id, result){ let sql = 'DELETE FROM items WHERE item_id = ?'; con.query(sql, id, (err, row, fields) => { console.log("error: ", err); if (err) result(err, null); console.log(row.affectedRows); result(null, row.affectedRows); }); }; module.exports= Item;Pengontrol
Saya membuat item file pengontrol. pengontrol. js di bawah folder pengontrol untuk menangani permintaan/respons dari klien
Sumber daya GET untuk titik akhir REST umumnya digunakan untuk mengambil atau membaca data dari server. Jadi di sini saya akan membuat titik akhir REST untuk mengambil data dari server
Endpoint POST digunakan untuk membuat record baru ke dalam server. PUT digunakan untuk memperbarui sumber daya yang ada di server dan DELETE digunakan untuk menghapus sumber daya yang ada di server
Panggilan balik menerima dua parameter, 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_1 adalah badan permintaan dan membawa informasi tentang permintaan. res adalah badan respons dan digunakan untuk menangani fungsi respons. Misalnya, fungsi 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_2 digunakan untuk mengembalikan data json
'use strict'; const Item = require('../model/item.model'); exports.findById = function(req, res) { const id = req.params.id; if (!id) { // 400 = bad request return res.status(400).send('The required path variable id is missing') } Item.findById(id, function(err, item) { if (err) return res.status(500).send('Error occured during fetching item for id ' + id); console.log('item: ', item); return res.send(item); }); }; exports.findByName = function(req, res) { const name = req.body.name // 400 = bad request if (!name) { return res.status(400).send('The required field name is missing') } Item.findByName(name, function(err, items) { if (err) return res.status(500).send('Error occured during fetching item for name ' + name); console.log('items: ', items); return res.send(items); }); }; exports.findAll = function(req, res) { Item.findAll(function(err, items) { if (err) return res.status(500).send('Error occured during fetching items'); console.log('items: ', items); return res.send(items); }); }; exports.create = function(req, res) { const newItem = new Item(req.body); // 400 = bad request if(req.body.constructor === Object && Object.keys(req.body).length === 0){ return res.status(400).send('One or more required fields are missing'); } if (!newItem.item_name || !newItem.item_desc || !newItem.item_price) { return res.status(400).send('One or more required fields are missing') } else { Item.create(newItem, function(err, item_id) { console.log('err: ', err); //if (err === Object) res.status(500).send('Item already exist with name ' + err.item_name); if (err || item_id <= 0) return res.status(500).send('Error occured during saving item'); return res.sendStatus(200); }); } }; exports.update = function(req, res) { const item = new Item(req.body); // 400 = bad request if(req.body.constructor === Object && Object.keys(req.body).length === 0) { return res.status(400).send('One or more required fields are missing'); } if (!item.item_id || !item.item_name || !item.item_desc || !item.item_price) { return res.status(400).send('One or more required fields are missing'); } else { Item.update(item, function(err, result) { if (err || result <= 0) return res.status(500).send('Error occured during updating item'); return res.sendStatus(200); }); } }; exports.delete = function(req, res) { const id = req.params.id; if (!id) { // 400 = bad request return res.status(400).send('The required path variable id is missing'); } Item.delete(id, function(err, employee) { if (err) return res.status(500).send('Error occured during deleting item'); return res.sendStatus(200); }); };_Rute
Barang itu. rute. File js di bawah rute menentukan titik akhir untuk REST API
const express = require('express') const router = express.Router() const controller = require('../controller/item.controller'); // Retrieve a single item with id router.get('/:id', controller.findById); // Retrieve a single item with id router.post('/name', controller.findByName); // Retrieve all items router.get('/', controller.findAll); // Create a new item router.post('/', controller.create); // Update an item router.put('/', controller.update); // Delete an item with id router.delete('/:id', controller.delete); module.exports = router_Titik Akhir API
- DAPATKAN 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_3. akan memberi Anda semua item yang disimpan dalam database
- DAPATKAN 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_4. akan memberikan item tertentu dengan id
- POSTING 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_5. akan memberi Anda semua item untuk badan permintaan yang diberikan
- POSTING 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_3. buat item untuk badan permintaan yang diberikan
- PUT 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_3. perbarui item sepenuhnya untuk badan permintaan yang diberikan
- HAPUS 'use strict'; const mysql = require('mysql'); var con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'roytuts' }); con.connect(function(err) { if (err) throw err; console.log("Connected to MySQL!"); }); module.exports = con;_4. menghapus item
Menguji REST API
Saya menggunakan alat tukang pos untuk menguji API REST saya. Anda dapat menggunakan alat klien REST atau perintah CURL untuk menguji sumber daya REST Anda. Saat Anda memanggil API di klien REST, Anda juga akan melihat hasilnya di konsol