Post

Restful API with Node.js and MongoDB

Salam hangat sahabat sharehubid. Kali ini sharhubid mencoba untuk sharing tentang bagaimana membuat Restful API dengan menggunakan Node.js dan menggunakan MongoDB.

Sebelumnya, apa sih Rest itu ?

REST (Representational State Transfer) adalah gaya ataupun arsitektur dalam mengembangkan web service, dimana sesuai dengan HTTP request.

Jadi pada artikel kali ini, kita akan membuat sebuah project sederhana untuk mempelajari pembuatan Rest API dengan menggunakan Node.js dan juga menggunakan db MongoDB.

Membuat Aplikasi

Ok, pertama - tama buatlah sebuah directory misalkan saja dengan nama simple-note, serperti berikut :

$ mkdir simple-note

Bila sudah, beralih ke directory tersebut lalu lakukan perintah untuk menginisiasi node. Sebelumnya pastikan dulu sudah terinstal secara global untuk node dan npm nya. Jangan lupa juga untuk memastikan sudah terinstall MongoDB.

$ npm init

Bila sudah selesai, maka pada root project tadi sudah terdapat file package.json disana. Untuk selanjutnya, kita akan menginstall dependencies lainnya yang kita butuhkan. Lakukan perintah serperti berikut :

$ npm install express body-parser mongoose --save

BIla sudah selesai, tentunya pada directory project akan terdapat 1 folder node_module dan 1 file package.json.

Setting Web Server

Selanjutnya kita akan membuat entry point utama dari project kita. Buatlah sebuah file dengan nama "server.js", lalu isikan code seperti berikut.

const express = require('express');
const bodyParser = require('body-parser');

// create express app
const app = express();

// parse requests dari content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }))

// parse requests dari content-type - application/json
app.use(bodyParser.json())

// define simple route untuk contoh route berhasil
app.get('/', (req, res) => {
    res.json({"message": "Aplikasi Simple Note"});
});

// listen for requests
app.listen(3000, () => {
    console.log("Server is listening on port 3000");
});

Yang kita lakukan diatas adalah, pertama kita mengimpor modul express dan body parser. Express adalah framework yang akan kita gunakan untuk membangun Rest API, sedangkan body parser adalah sebuah modul yang memparsing request dan membuat objeck req.body yang dapat kita gunakan di route yang akan kita buat nanti.

Selanjutnya kita mendefine suatu cons yang dicontohkan dengan nama app sebagai express(), lalu kita membuat dua buah middleware body parser dengan menggunakan express use() method yang diatas ditunjukan pada app.use(). Middleware ini adalah fungsi yang memiliki akses ke request object dan respons.

Bila sudah, kita bisa memeriksa apakah sudah berhasil dengan menjalankan node server dengan perintah berikut :

$ node server.js 

Bila tidak ada yang salah, makan akan ada pesan "Server is listening on port 3000", dan bila kita akses "localhost:3000" pada browser kita, maka akan tampil pesan seperti yang kita define pada simple route diatas.

Konfigurasi dan Koneksi ke DataBase

Masih pada project yang sama, buatlah sebuah direktori dengan nama "config" lalu beralih pada direktori tersebut dan buat sebuah file dengan nama "database.config.js".
Kemudian, tambahkan code sebagai berikut :

module.exports = {
    url: 'mongodb://localhost:27017/simple-note'
}

Selanjutnya kita akan mengimpor database konfigurasi tersebut ke server.js. Beralih kembali pada file server.js lalu tambahkan code seperti berikut :

// Configure database
const dbConfig = require('./config/database.config.js');
const mongoose = require('mongoose');

mongoose.Promise = global.Promise;

// Connecting ke database
mongoose.connect(dbConfig.url, {
    useNewUrlParser: true
}).then(() => {
    console.log("Successfully connected to the database");    
}).catch(err => {
    console.log('Could not connect to the database. Exiting now...', err);
    process.exit();
});

Bila sudah, jalankan ulang node server dan pastikan kita telah bisa terkoneksi dengan database. Jangan lupa memastikan mongodb service sudah berjalan pada operating system kita.

$ node server.js 
Server is listening on port 3000
Successfully connected to the database

Defining Model

Kali ini kita akan membuat model. Buat sebuah direktori pada project dengan nama "app", lalu pada direktori app tersebut, buatlah sebuah direktori dengan nama "models".

Lalu, pada direktori models, buatlah sebuah file dengan nama "note.model.js". Kemudian tambahkan code seperti berikut :

const mongoose = require('mongoose');

const NoteSchema = mongoose.Schema({
    title: String,
    content: String
}, {
    timestamps: true
});

module.exports = mongoose.model('Note', NoteSchema);

Sebagai percobaan, kita membuat data field yang simple yaitu berupa title dan content. Kita juga mendefine timestamps untuk secara otomatis membuat field created_at dan update_at pada mongoose.

Defining Routes

Masih pada direktori app, buatlah sebuah direktori dengan nama "routes" dan pada direktori routes tersebut, buatlah sebuah file dengan nama "note.routes.js". Selanjutnya, tambahkan code sebagai berikut :

module.exports = (app) => {
    const notes = require('../controllers/note.controller.js');

    // Create Note baru
    app.post('/notes', notes.create);

    // Retrieve semua Note
    app.get('/notes', notes.findAll);

    // Retrieve single Note berdasar Id
    app.get('/notes/:noteId', notes.findOne);

    // Update single Note berdasar Id
    app.put('/notes/:noteId', notes.update);

    // Delete single Note berdasar Id
    app.delete('/notes/:noteId', notes.delete);
}

Bila diperhatikan, pada gambar diatas, kita mengimpor sebuah controller dengan nama "note.controller.js", dan tentunya sekarang program akan error karena kita belum membuat file controller tersebut.

Controller Function

Masih pada direktori app, buatlah sebuah direktori dengan nama "controllers", lalu pada direktori controllers tersebut, buatlah sebuah file dengan nama "note.controller.js". Bila sudah, tambahkan code seperti berikut :

 // Create and Save a new Note

exports.create = (req, res) => {
    // Validate request
    if(!req.body.content) {
        return res.status(400).send({
            message: "Note content can not be empty"
        });
    }

    // Create a Note
    const note = new Note({
        title: req.body.title || "Untitled Note", 
        content: req.body.content
    });

    // Save Note in the database
    note.save()
    .then(data => {
        res.send(data);
    }).catch(err => {
        res.status(500).send({
            message: err.message || "Some error occurred while creating the Note."
        });
    });
};
// Retrieve and return all notes from the database.
exports.findAll = (req, res) => {
    Note.find()
    .then(notes => {
        res.send(notes);
    }).catch(err => {
        res.status(500).send({
            message: err.message || "Some error occurred while retrieving notes."
        });
    });
};

// Find a single note with a noteId exports.findOne = (req, res) => { Note.findById(req.params.noteId) .then(note => { if(!note) { return res.status(404).send({ message: "Note not found with id " + req.params.noteId }); } res.send(note); }).catch(err => { if(err.kind === 'ObjectId') { return res.status(404).send({ message: "Note not found with id " + req.params.noteId }); } return res.status(500).send({ message: "Error retrieving note with id " + req.params.noteId }); }); };

Selanjutnya, akan dilanjutkan pada artikel berikutnya. Terimakasih.