lifelong learner — urip iku urup, currently working on accenture.

Node Rest API dengan express & mysql

1
Degananda.com -

pada ulasan kali ini akan membahasa megenai pembuatan Rest API dengan menggunakan :

  • NodeJS
  • Mysql native driver untuk nodejs
  • Express

Diharapkan sebelum mengikuti ulasan ini telah mengerti express. Minimal pada proses routing atau anda dapat membaca express routing chapter 1 : https://degananda.com/2017/04/08/express-routing-route-method/ ad Chapter 2 akan dirilis segera yang akan membahas lebih dalam mengenai router dan Router Module dari express. Agar lebih mudah mengikuti ulasan ini maka dapat melakukan clone project di :

https://github.com/degananda/express-mysql

Sebelum mengikuti ulasan ini mungkin anda tertarik melihat tutorial pembuatan rest api dengan menggunakan code igniter rest server(php) disini : https://degananda.com/2016/11/13/rest-webservices-dengan-code-igniter-menggunakan-library-rest-server-bagian-1/

Web services yang akan dibuat pada ulasan ini memanipulasi data “note” atau catatan. Sebuah catatan memiliki isi dari note dan juga tanggal pembuatan dari catatan tersebut. Fungsi yang akan dicakup adalah :

  1. Menambahkan note baru dengan menggunakan http post
  2. Mengubah note yang sudah ada dengan menggunakan http put
  3. Menghapus note yang telah ada dengan menggunakan http delete
  4. Melihat note dengan menggunakan http get

Untuk memperjelas maka dibawah ini adalah struktur tabel (sql) dari note.

--
-- Table structure for table `note`
--

CREATE TABLE IF NOT EXISTS `note` (
`id_note` int(11) NOT NULL,
  `isi_note` text NOT NULL,
  `tanggal_note` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `note`
--
ALTER TABLE `note`
 ADD PRIMARY KEY (`id_note`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `note`
--
ALTER TABLE `note`
MODIFY `id_note` int(11) NOT NULL AUTO_INCREMENT;

0. Membuat project node

npm init

 

1.  Install module

module yang dibutuhkan dan lakukan inisialisasi pada app.js (tergantung konfigurasi npm init anda). Berikut ini adalah modul-modul yang dibutuhkan :

  • Express, untuk menghandle routing & http agar dapat menjadi sebuah web services.
  • Mysql, sebagai database yang digunakan untuk menyimpan data note
  • Bodyparser, web services yang dibuat akan menerima data(request body) berupa JSON dan output berupa JSON.
  • Express-validator, membantu memvalidasi(cek apakah kosong, dsb) request body / data http.

// module
var express = require('express');
var mysql = require('mysql');
var bodyparser = require('body-parser');
var expressValidator = require('express-validator');

// express settings
var app = express();
var appPort = process.env.port || 7250;

 

2. setting mysql dan melakukan koneksi ke database

dibawah ini adalah kode untuk koneksi nodejs dengan mysql. Yang perlu didefinisikan adalah autentikasi mysql (host, user, password dan database) seperti pada umumnya. Kemudian , panggil fungsi connect pada instances connection untuk menyambungkan ke mysql. Fungsi connect memiliki sebuah callback error yang dapat digunakan sebagai kondisi saat node gagal melakukan koneksi ke mysql.


// mysql settings
var connection = mysql.createConnection({
host     : 'localhost',
user     : 'root',
password : '',
database : 'db_scriptsi'
});

connection.connect(function(err){
if(err){
console.log('something wrong with mysql database connection');
connection.end();
}
});

3. Membuat  “note” router module

fungsi file ini adalah untuk mendefinisikan rules atau aturan dari router. Sql query akan dieksekusi melalui router module dari express ini. Sehingga controller dan model bercampur menjadi satu file.

var express = require('express');
var mysql = require('mysql');
var routerList = function(connection){
    var router = express.Router();
    // get note
    router.get('/list', function(req, res){
        var query = "SELECT id_note, isi_note, tanggal_note FROM note ORDER BY tanggal_note DESC";
        connection.query(query, function(err, result, fields){
            if(err){
                throw err;
            } else {
                if(result.length > 0){
                    res.status(200).json(result);
                } else {
                    var output = {
                        msg : "tidak ada data note pada database"
                    }
                    res.status(200).json(output);
                }
            }
        });
    });

    // get note details
    router.route('/:id').get(function(req, res){
        var query = "SELECT isi_note, tanggal_note FROM note WHERE id_note = '"+req.params.id+"'";
        connection.query(query, function(err, result, fields){
            if(err){
                throw err;
            } else {
                if(result.length > 0){
                    res.status(400).json(result);
                } else {
                    var output = {
                        msg : "tidak ada data dengan id tersebut"
                    }
                    res.status(200).json(output);
                }
            }
        });
    })
    .put(function(req, res){
        var query = "UPDATE note SET isi_note = '"+req.body.isi_note+"', tanggal_note=NOW() WHERE id_note = '"+req.params.id+"'";
        connection.query(query, function(err, result, fields){
            req.assert('isi_note', 'isi_note belum terdefinisi').notEmpty();
            var errors = req.validationErrors();
            if(!errors){
                if(err){
                    res.status(400).send(err);
                } else{
                    var output = {
                            msg : "berhasil mengubah note"
                    }
                    res.status(200).json(output);
                }
            } else {
                res.status(400).send(errors);
            }
        });
    });

    // post new note
    router.post('/', function(req, res){
        req.assert('isi_note', 'isi_note belum terdefinisi').notEmpty();
        var errors = req.validationErrors();
        if(errors){
            res.status(400).send(errors);
        } else {
            var query = "INSERT INTO NOTE(isi_note,tanggal_note) VALUES('"+req.body.isi_note+"', NOW())";
            connection.query(query, function(err, result, fields){
                if(err){
                    throw err;
                } else {
                    var output = {
                        msg : "berhasil menambahkan note baru"
                    }
                    res.status(200).json(output);
                }
            });
        }
    });

    // delete note
    router.delete('/:id', function(req, res){
        var query = "DELETE FROM note where id_note = '"+req.params.id+"'";
        connection.query(query, function(err, result, fields){
            if(err){
                throw err;
            } else {
                if(fields){
                    var output = {
                        msg : "berhasil menghapus note."
                    }
                    res.status(200).json(output);
                } else {
                    res.status(400).json({
                        msg : "tidak ada data note"
                    });
                }
            }
        });
    });

    return router;
}
module.exports = routerList;

 

Fungsi query pada instances connection yang kita berikan(pass) dari router ke router module(untuk penjelasan lihat langkah ke-4) memiliki tiga buah callback yaitu :

  1. err -> callback yang berisi informasi mengenai error, misalnya terjadi sql query maka informasi error akan tersimpan pada callback ini
  2. fields -> callback yang menginformasikan apakah ada respon dari database mysql. Sejauh yang saya tahu fields akan kosong ketika tidak terdapat data yang dihasilkan oleh sql query. Sehingga cocok untuk menfilter apakah query tersebut match dengan data yang ada atau tidak.
  3. result -> hasil dari sql query akan disimpan disini.

4. Menghubungkan Routermodule dengan router

Selain menghubungkan routermodule dengan router, yang dilakukan di sini adalah menginjeksi note routermodule dengan instances connection yang kita panggil pada app.js Tujuannya adalah agar instances connection ini dapat digunakan bersama-sama dimodul tanpa pada setiap modul memanggil kembali/membuat instances kembali. Instances connection inilah yang digunakan untuk melakukan sql query.


// routeModule.
var noteRouter = require('./routeModule/note.js')(connection);

// use body parser
app.use(bodyparser.urlencoded({extended:true}));
app.use(expressValidator());
app.use(bodyparser.json());


// use route.
app.use('/note', noteRouter);

app.listen(appPort,function(){
console.log('running....');
});

done~, web services siap untuk dikonsumsi oleh aplikasi frontend.