Membangun RESTful API Dengan Express Js dan MongoDb
Diperbarui 11 Juli 2019: Ini adalah tonggak utama bagi artikel ini untuk menjangkau lebih dari 70.000 pembaca, dan umpan balik telah membantu banyak orang yang mencoba membangun API menggunakan NodeJs. Untuk memperbaikinya, kami telah memperbarui cuplikan kode dalam tutorial ini untuk memperbaiki bug yang telah diidentifikasi sebagian besar pembaca. Terima kasih atas tanggapan Anda yang baik. Saya juga ingin mencari waktu untuk menulis hal-hal yang baik. Ayo buat aplikasi hebat untuk dunia — David Inyangetoh
RESTFul API telah ada selama beberapa waktu. Pada saat penulisan ini, hampir tidak mungkin untuk menjadi pengembang perangkat lunak tanpa membuat dan menggunakan satu atau lebih API.
API adalah singkatan dari Application Programming Interface yang telah menjadi bagian integral dari pengembangan perangkat lunak. “Ini adalah seperangkat metode komunikasi yang terdefinisi dengan baik antara berbagai komponen” — Wikipedia.
RESTFul API, di sisi lain, adalah API yang sesuai dengan gaya arsitektur REST. REST mengacu pada Representasional State Transfer, gaya arsitektur yang mendefinisikan satu set batasan dan properti berdasarkan HTTP.
Implementasi paling umum dari layanan web RESTFul adalah JSON API, yang akan kita gunakan dalam tutorial ini. Pelajari lebih lanjut tentang spesifikasi, contoh, dan implementasi JSON API. JSON hanyalah notasi objek Javascript.
Dalam tutorial ini, Anda akan membuat API sederhana menggunakan ExpressJs dan MongoDb dengan fungsi CRUD untuk kontak.
Aplikasi yang diperlukan
- NodeJS
- Postman
- MongoDb
- IDE
Ayo mulai..
Bootstrap proyek
Untuk mem-bootstrap proyek Anda, Anda perlu memastikan bahwa NodeJs, NPM, dan MongoDb diinstal pada mesin Anda. Untuk melakukan ini, buka terminal atau command prompt dan jalankan
node -v
Ini akan mengkonfirmasi versi Nodejs yang telah Anda instal. jalankan
npm -v
Pastikan Anda telah menginstal Node Package Manager (npm). Lihat pada output di bawah ini
Sekarang setelah Anda menginstal Node dan NPM, Anda dapat melanjutkan pengaturan proyek Anda. Jika Node tidak diinstal pada mesin Anda, Anda perlu mengunduh versi yang kompatibel dengan OS dari sini dan menginstalnya sebelum melanjutkan.
Selanjutnya, Anda perlu memastikan bahwa MongoDb diinstal.
mongo --version
output
Jika MongoDb tidak diinstal pada mesin Anda, Anda perlu mengunjungi Pusat Unduhan MongoDb untuk mengunduh dan menginstal versi yang kompatibel dengan sistem operasi Anda sebelum melanjutkan.
Beri nama proyek Anda
Kemudian beri nama proyek tersebut. Ini disebut REST Hub. Untuk menyimpan file proyek, Anda perlu menemukan lokasi yang sesuai di sistem file. Secara pribadi, dengan ketersediaan berbagai alat dan bahasa pemrograman, saya memutuskan untuk menyimpan proyek berbasis node saya di direktori nodeprojects di drive lokal saya. Sekarang buat resthub direktori proyek baru menggunakan perintah berikut:
// Navigate to the root directory of your Node projects
cd C:\nodeprojects
// Create directory for your new project RestHub
mkdir resthub
// Navigate into the directory
cd resthub
Inisialisasi proyek NodeJs Anda menggunakan npm init dan ikuti wizard untuk menyiapkan proyek Anda.
Terima nama dan versi default, tetapi ubah deskripsi seperti di atas. Ingatlah untuk mengubah nama penulis menjadi milik Anda dan menerima lisensi default untuk menghasilkan package.json. Jika Anda membuat kesalahan, Anda tidak perlu khawatir tentang beberapa input. File ada di direktori root proyek Anda dan dapat diedit secara bebas. Saya membutuhkan layar yang mirip dengan ini.
Pada titik ini, Anda perlu memastikan bahwa file package.json tersedia di root proyek dengan membuat daftar file menggunakan ls -l atau dir, tergantung pada OS Anda.
Saatnya menginstal Express dan menyiapkan server
Untuk memberikan akses titik akhir API Anda ke alat seperti browser atau PostMan, Anda perlu menjalankan server web. Untuk mencapai ini, gunakan ExpressJS. Jika Anda baru mengenal ExpressJS, silakan kunjungi situs web resmi untuk informasi lebih lanjut. Jika tidak, mari kita lanjutkan. Gunakan npm untuk menginstal Express di proyek Anda menggunakan perintah ini
npm install express --save
Tergantung pada kecepatan koneksi, mungkin diperlukan beberapa waktu untuk menyelesaikan instalasi, tetapi pada akhirnya, expressJs dan dependensinya akan diinstal sebagai berikut.
Semua instalasi, wizard, dan konfigurasi ini sudah cukup. Anda harus mulai menulis kode sekarang. Buka IDE favorit Anda dan milik saya adalah Visual Studio Code.
Buka direktori proyek menggunakan IDE favorit Anda dan buat file index.js
Anda dapat melihat satu direktori node_modules dan satu file package.json. Package.json menyimpan konfigurasi proyek nodeJs termasuk dependensinya. Anda akan melihat expressjs-v4.16.3 yang baru saja diinstal di bawah Dependensi. Paket node yang diinstal ada di node_modules dan tidak mengubah apa pun di direktori itu. Harus dikecualikan dengan gitignore saat mendorong ke repositori jarak jauh. Di package.json, saya mendefinisikan index.js sebagai titik masuk untuk aplikasi saya. Sekarang Anda perlu membuat file itu dan mengatur server web Anda.
Di IDE, buat file index.js dan tambahkan kode ini.
// FileName: index.js// Import express
let express = require('express')// Initialize the app
let app = express();// Setup server port
var port = process.env.PORT || 8080;// Send message for default URL
app.get('/', (req, res) => res.send('Hello World with Express'));// Launch app to listen to specified port
app.listen(port, function () {
console.log("Running RestHub on port " + port);
});
Simpan file dan jalankan indeks node di jendela terminal. Anda harus mendapatkan ini
Ketika saya mengakses http://localhost:8080 di browser saya, saya mendapatkan yang berikut.
Saya berhasil !!! Sekarang server Express sedang berjalan. Saya lakukan, ya! Tidak ada yang lebih manis daripada menjalankan pengaturan dengan lancar. Jika Anda tidak mendapatkan hasil yang sama seperti saya pada saat itu, periksa lagi untuk melihat apakah Anda melewatkan titik atau titik koma.
OKE. Mari konfigurasikan aplikasi sedikit lebih profesional. Ikuti beberapa praktik terbaik saat menerapkan ini, tetapi tetap sesederhana mungkin. Ini adalah tutorial pemula, dan sebagian besar tutorial yang saya temui di masa lalu cenderung menggabungkan semuanya dalam satu file untuk mengimplementasikan API yang begitu sederhana. Di dunia nyata, ini tidak terjadi, terutama jika tim memilih arsitektur seperti pola MVC.
Suntikkan sedikit MVC ke dalam struktur aplikasi ini untuk menjaga file Anda tetap ramping dan mengisolasi kekhawatiran Anda. Anda perlu membuat tiga file lagi yang tercantum di bawah ini.
- api-routes — Semua titik akhir api didefinisikan dalam file ini
- Controller — Menangani permintaan HTTP dan menentukan titik akhir yang tersedia
- Model — Kelola lapisan basis data (permintaan dan tanggapan)
Buat file di root proyek api-routes.js dan tambahkan kode berikut ke dalamnya.
// Filename: api-routes.js
// Initialize express router
let router = require('express').Router();
// Set default API response
router.get('/', function (req, res) {
res.json({
status: 'API Its Working',
message: 'Welcome to RESTHub crafted with love!'
});
});
// Export API routes
module.exports = router;
Pertama, impor Router Ekspres, atur rute default, ekspor modul, dan izinkan untuk diimpor ke aplikasi Anda. Untuk dapat mengakses root ini, Anda perlu memodifikasi index.js dan menambahkan beberapa baris kode seperti itu.
// Add the code below to index.js// Import routes
let apiRoutes = require("./api-routes")// Use Api routes in the App
app.use('/api', apiRoutes)
Kemudian gunakan ctrl + c atau cmd + c di terminal Anda untuk menghentikan proses dan gunakan indeks node untuk memulai ulang server aplikasi.
Kode di atas mengimpor file api-routes dan memberi tahu aplikasi untuk menggunakan rute ini setiap kali pengguna mengunjungi example.com/api atau dalam hal ini http://localhost:8080/api. http://localhost:8080/ Jika Anda mengakses api dan menguji apakah itu berfungsi, Anda akan melihat layar ini.
Ya! Itu berhasil. Anda dapat beristirahat dan minum air kemasan, seperti yang saya lakukan. Ini berjalan dengan baik, tetapi kita perlu memperbaiki beberapa hambatan agar semuanya tetap berjalan.
Dengan pengaturan saat ini, Anda perlu me-restart server setiap kali Anda membuat perubahan pada file atau menambahkan file baru. Ini terkadang bisa membuat stres dan membuat frustrasi, tetapi ada perbaikan cepat untuk itu. Ada modul node yang menyediakan perbaikan cepat itu. Pantau file dan restart Express-Server jika ada perubahan. Kami menyarankan Anda menginstal modul ini secara global karena mungkin diperlukan untuk proyek lain seperti ini.
npm install -g nodemon// On Mac or Linux
sudo npm install -g nodemon
Sekarang setelah Anda menginstal nodemon, luncurkan aplikasi menggunakan indeks nodemon sebagai gantinya, ubah teks rute default dari Hello World dengan Express dan Nodemon, dan segarkan browser Anda untuk melihat perubahannya.
dingin. Anda tidak perlu memulai ulang server aplikasi setiap kali melakukan perubahan.
Pengaturan MongoDb
Jika tidak, dianggap bahwa MongoDb diinstal pada mesin Anda. Kunjungi Pusat Unduhan Mongodb untuk mengunduh dan menginstal. Buka jendela terminal lain dan mulai mongodb-server dengan perintah ini
mongod
Anda akan mendapatkan output yang mirip dengan ini
Biarkan jendela ini tetap terbuka untuk menggunakan MongoDb. Buka terminal root proyek Anda dan instal paket-paket ini
- mongoose npm instal mongoose --save
- body-parser npm install body-parser --save
Mongoose adalah paket Nodejs untuk pemodelan Mongodb. Membantu Nodejs menangani validasi mongodb dan logika bisnis. Belajar lebih tentang.
Body-parser memungkinkan aplikasi Anda mengurai data dari permintaan yang masuk, seperti data formulir melalui urlencode. Anda perlu mengimpor ini ke aplikasi Anda dan menggunakannya.
Ubah index.js di baris ini
Pembaruan: Memperbarui jalur koneksi Mongoose untuk menambahkan opsi useNewUrlParser dan memperbaiki peringatan usang
// Import Body parser
let bodyParser = require('body-parser');// Import Mongoose
let mongoose = require('mongoose');// Configure bodyparser to handle post requests
app.use(bodyParser.urlencoded({
extended: true
}));app.use(bodyParser.json());// Connect to Mongoose and set connection variable
// Deprecated: mongoose.connect('mongodb://localhost/resthub');
mongoose.connect('mongodb://localhost/resthub', { useNewUrlParser: true});var db = mongoose.connection;
Index.js lengkapnya terlihat seperti ini
// Import express
let express = require('express');
// Import Body parser
let bodyParser = require('body-parser');
// Import Mongoose
let mongoose = require('mongoose');
// Initialise the app
let app = express();
// Import routes
let apiRoutes = require("./api-routes");
// Configure bodyparser to handle post requests
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
// Connect to Mongoose and set connection variable
mongoose.connect('mongodb://localhost/resthub', { useNewUrlParser: true});
var db = mongoose.connection;
// Added check for DB connection
if(!db)
console.log("Error connecting db")
else
console.log("Db connected successfully")
// Setup server port
var port = process.env.PORT || 8080;
// Send message for default URL
app.get('/', (req, res) => res.send('Hello World with Express'));
// Use Api routes in the App
app.use('/api', apiRoutes);
// Launch app to listen to specified port
app.listen(port, function () {
console.log("Running RestHub on port " + port);
});
Semuanya harus bekerja dengan baik. Kemudian atur controller untuk menangani permintaan API dan atur model untuk menyimpan/mengambil data dari database. Menerapkan model data sederhana yang mencakup informasi kontak toko, termasuk detail berikut:
- nama
- Surel
- telepon
- seks
Terapkan titik akhir berikut
- GET/api/ daftar semua kontak
- POST/api/ membuat kontak baru
- GET/api/kontak/{id} Dapatkan satu kontak
- PUT/api/kontak/{id} Perbarui satu kontak
- HAPUS/api/kontak/{id} Hapus satu kontak
Buka dua file lagi, contactController.js dan contactModel.js, dan tempelkan kode-kode ini.
// contactController.js// Import contact model
Contact = require('./contactModel');// Handle index actions
exports.index = function (req, res) {
Contact.get(function (err, contacts) {
if (err) {
res.json({
status: "error",
message: err,
});
}
res.json({
status: "success",
message: "Contacts retrieved successfully",
data: contacts
});
});
};// Handle create contact actions
exports.new = function (req, res) {
var contact = new Contact();
contact.name = req.body.name ? req.body.name : contact.name;
contact.gender = req.body.gender;
contact.email = req.body.email;
contact.phone = req.body.phone;// save the contact and check for errors
contact.save(function (err) {
// if (err)
// res.json(err);res.json({
message: 'New contact created!',
data: contact
});
});
};// Handle view contact info
exports.view = function (req, res) {
Contact.findById(req.params.contact_id, function (err, contact) {
if (err)
res.send(err);
res.json({
message: 'Contact details loading..',
data: contact
});
});
};// Handle update contact info
exports.update = function (req, res) {Contact.findById(req.params.contact_id, function (err, contact) {
if (err)
res.send(err);contact.name = req.body.name ? req.body.name : contact.name;
contact.gender = req.body.gender;
contact.email = req.body.email;
contact.phone = req.body.phone;// save the contact and check for errors
contact.save(function (err) {
if (err)
res.json(err);
res.json({
message: 'Contact Info updated',
data: contact
});
});
});
};// Handle delete contact
exports.delete = function (req, res) {
Contact.remove({
_id: req.params.contact_id
}, function (err, contact) {
if (err)
res.send(err);res.json({
status: "success",
message: 'Contact deleted'
});
});
};
Pengontrol telah menetapkan metode untuk menangani permintaan dan tanggapan dari berbagai titik akhir API. Pertama, impor contactModel dan gunakan instans itu untuk menangani fungsionalitas CRUD (Create, Read, Update, Delete) API. Berikut adalah kode untuk contactModel.js
// contactModel.jsvar mongoose = require('mongoose');// Setup schema
var contactSchema = mongoose.Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
gender: String,
phone: String,
create_date: {
type: Date,
default: Date.now
}
});// Export Contact model
var Contact = module.exports = mongoose.model('contact', contactSchema);module.exports.get = function (callback, limit) {
Contact.find(callback).limit(limit);
}
Model mengimpor mongoose, membuat skema database untuk kontak, dan mengekspor modul untuk akses. Pembaruan terakhir menambahkan rute kontak ke titik akhir API. Berikut adalah kode lengkap untuk api-routes.js
// api-routes.js// Initialize express router
let router = require('express').Router();// Set default API response
router.get('/', function (req, res) {
res.json({
status: 'API Its Working',
message: 'Welcome to RESTHub crafted with love!',
});
});// Import contact controller
var contactController = require('./contactController');// Contact routes
router.route('/contacts')
.get(contactController.index)
.post(contactController.new);router.route('/contacts/:contact_id')
.get(contactController.view)
.patch(contactController.update)
.put(contactController.update)
.delete(contactController.delete);// Export API routes
module.exports = router;
Wow! Itu benar-benar jauh. Memasak selesai dan saatnya menguji titik akhir API.
Cobalah di browser Anda. Layar ini ditampilkan ketika Anda mengakses http://localhost:8080/api/kontak
Bagusnya. Belum ada kontak dalam koleksi. Saya perlu menambahkan beberapa kontak ke dalamnya. Postman adalah alat yang hebat untuk menguji dan men-debug titik akhir API. Jika diinstal pada mesin Anda, dapatkan di sini. Suka…
Saya menguji /api/kontak dengan Postman dan mendapatkan hasil yang sama.
Ini juga mendukung daftar panjang HTTP GET, POST, PUT, DELETE, dan jenis permintaan dasar lainnya.
Untuk menambahkan kontak baru, ubah metode dari dropdown ke POST, pilih tab Body, masukkan nilai di kunci: kotak input nilai di bawah tab Body, dan setelah selesai, Kirim ]Klik. Lihat contoh di bawah ini.
Ubah nilai untuk membuat kontak lain. Buka tab lain dan gunakan permintaan GET untuk melihat semua kontak tersebut.
Refresh browser Anda untuk melihat apakah telah diperbarui. Layar ini ditampilkan.