Membuat CRUD dengan Node.js dan SQL Server

Muhammad Arslan 1 Juli 2017

Membuat CRUD dengan Node.js dan SQL Server

##Pendahuluan

Node.js merupakan salah satu bahasa pemrograman yang didukung oleh serverless architecture secara umum dan secara khusus didukung oleh Azure Function. Node.js dapat melakukan akses ke beberapa layanan Azure seperti Azure Redis Cache, Azure SQL Database, dan layanan lainnya.

Namun sebelum langsung melakukan akses ke Azure SQL Database, kita dapat melakukan development dengan mengakses SQL Server di local. Mari kita ikuti tutorial berikut.

##Instalasi

Bila kamu tidak menggunakan Windows, kamu dapat mengikuti cara instalasi SQL Server di non-Windows di tutorial berikut https://www.codepolitan.com/menggunakan-sql-server-melalui-linux-dan-docker-594df588318c8

Kemudian pasang package SQL Server untuk Node.js dengan menggunakan NPM. Kita gunakan Tedious untuk akses ke SQL Server.

$ npm install tedious

##Membuat Database dan Tabel di SQL Server

Gunakan mssql, aplikasi konsol yang digunakan untuk melakukan interaksi dengan SQL Server yang ditulis juga menggunakan Node.js:

$ mssql -s sa -p P@55w0rd

> USE master;

> CREATE DATABASE bootcamp;

> use bootcmap;

> CREATE TABLE Participant (
...  id int NOT NULL IDENTITY PRIMARY KEY,
...  username varchar(50) NOT NULL,
...  email varchar(50) NOT NULL,
...  phone varchar(10) NOT NULL,
...  course varchar(100) NOT NULL,
...);

Pada contoh kode diatas, kita buat sebuah tabel dengan nama Participant di dalam database bootcamp.

##Mengambil Semua Data

Sebenarnya, Tedious ini hanya memfasilitasi kita dengan raw query saja. Pertama kita harus membuat dulu connection kemudian eksekusi query di dalam event connect.

Kemudian buat objek Request dan ambil hasilnya di event row dan untuk mengakhiri query, jalankan aksi di dalam event doneProc. Karena data yang dihasilkan di event row cuma satu baris, maka kita perlu menampungnya di variabel global. Barulah hasilnya dijalankan di dalam event doneProc.

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;


// Create connection to database
var config = {
  userName: 'sa', // update me
  password: 'P@55w0rd', // update me
  server: 'localhost', // update me
  options: {
      database: 'bootcamp' //update me
  }
}

var connection = new Connection(config);

// Attempt to connect and execute queries if connection goes through
connection.on('connect', function(err) {
    if (err) {
        console.log(err)
    }
    else{
        queryDatabase()
    }
});

function queryDatabase(){

    console.log('Reading rows from the Table...');

    // Read all rows from table
    request = new Request(
        "SELECT * FROM participant",
        function(err, rowCount, rows) {
            console.log(rowCount + ' row(s) returned');
        }
    );

    var results = [];
    request.on('row', function(columns) {
        // console.log(columns);
        results.push(columns);
    });

    request.on('doneProc', function(){
      console.log("Querying is done...");
      for (idx in results){
        // console.log(results[idx]);
        console.log(results[idx][0].value.toString()+" "+results[idx][1].value);
      }
      process.exit();
    })

    connection.execSql(request);
}

##Mengambil Salah Satu Row

Untuk parameterized query kita dapat gunakan Util.format() untuk membuat query lebih rapih dan cantik.

Berikut adalah contoh kode untuk mengambil salah satu row dengan Node.js:

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var Util = require('util');

// Create connection to database
var config = {
  userName: 'sa', // update me
  password: 'P@55w0rd', // update me
  server: 'localhost', // update me
  options: {
      database: 'bootcamp' //update me
  }
}

var connection = new Connection(config);

// Attempt to connect and execute queries if connection goes through
connection.on('connect', function(err) {
    if (err) {
        console.log(err)
    }
    else{
        queryDatabase()
    }
});

function queryDatabase(){

    console.log('Reading rows from the Table...');

    // Read all rows from table
    request = new Request(
        Util.format("SELECT * FROM participant WHERE ID = %d", 2),
        function(err, rowCount, rows) {
            console.log(rowCount + ' row(s) returned');
        }
    );

    request.on('row', function(columns) {
        console.log(columns);
    });

   request.on('doneProc', function(){
      console.log("Querying is done...");
      process.exit(1);
    })

    connection.execSql(request);
}

##Membuat Data Baru

Berikut adalah contoh kode untuk membuat row baru dengan Node.js:

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;


// Create connection to database
var config = {
  userName: 'sa', // update me
  password: 'P@55w0rd', // update me
  server: 'localhost', // update me
  options: {
      database: 'bootcamp' //update me
  }
}

var connection = new Connection(config);

// Attempt to connect and execute queries if connection goes through
connection.on('connect', function(err) {
    if (err) {
        console.log(err)
    }
    else{
        insertIntoDatabase()
    }
});


function insertIntoDatabase(){

    console.log("Inserting a new object into database...");

    request = new Request(
        "INSERT INTO participant (Username, Email, Phone, Course) OUTPUT INSERTED.Username VALUES ('Kresnagaluh', 'kresnagaluh@gmail.com', '7501234', 'Pelatihan Membuat Game dengan HTML5 dan Construct 2')",
        function(err, rowCount, rows) {
            console.log(rowCount + ' row(s) inserted');
    });

    request.on('doneProc', function(){
      console.log("Insert is done...");
      process.exit(1);
    })

    connection.execSql(request);
}

##Memperbaharui Suatu Data

Berikut adalah contoh kode untuk memperbaharui row dengan Node.js:

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var Util = require("util");

// Create connection to database
var config = {
  userName: 'sa', // update me
  password: 'P@55w0rd', // update me
  server: 'localhost', // update me
  options: {
      database: 'bootcamp' //update me
  }
}

var connection = new Connection(config);

// Attempt to connect and execute queries if connection goes through
connection.on('connect', function(err) {
    if (err) {
        console.log(err)
    }
    else{
        insertIntoDatabase()
    }
});


function insertIntoDatabase(){

    console.log("Updating an object in database...");

    console.log(Util.format("UPDATE participant SET Username=%s, Email=%s, Phone=%s, Course=%s WHERE ID=%d",
                  "Kresna Galuh",
                  "kresna@gmail.com",
                  "0857-5881-1884",
                  "Membangun Aplikasi Web dengan PHP dan MySQL",
                  2
              ));

    request = new Request(
        Util.format("UPDATE participant SET Username='%s', Email='%s', Phone='%s', Course='%s' WHERE ID=%d",
                  "Kresna Galuh",
                  "kresna@gmail.com",
                  "0857-5881-1884",
                  "Membangun Aplikasi Web dengan PHP dan MySQL",
                  2
              ),
        function(err, rowCount, rows) {
            console.log(rowCount + ' row(s) inserted');
    });

    request.on('doneProc', function(){
      console.log("Querying is done...");
      process.exit(1);
    })

    connection.execSql(request);
}

##Menghapus Salah Satu Data

Berikut adalah contoh kode untuk menghapus row dengan Node.js:

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var Util = require('util');

// Create connection to database
var config = {
  userName: 'sa', // update me
  password: 'P@55w0rd', // update me
  server: 'localhost', // update me
  options: {
      database: 'bootcamp' //update me
  }
}

var connection = new Connection(config);

// Attempt to connect and execute queries if connection goes through
connection.on('connect', function(err) {
    if (err) {
        console.log(err)
    }
    else{
        queryDatabase()
    }
});

function queryDatabase(){

    console.log('Reading rows from the Table...');

    // Read all rows from table
    request = new Request(
        Util.format("DELETE FROM participant WHERE id = %d", 1002),
        function(err, rowCount, rows) {
            console.log(rowCount + ' row(s) returned');
        }
    );

    request.on('row', function(columns) {
        console.log(columns);
    });

    request.on('doneProc', function(){
      console.log("Querying is done...");
      process.exit(1);
    });

    connection.execSql(request);
}

##Penutup

Tedious sangat enak digunakan, namun dokumentasinya sangat minim, sehingga kamu harus melihat contoh kode yang disediakan olehnya di Github atau lebih baik melihat dokumentasi Tedious di dokumentasi resmi Microsoft untuk SQL Server for Linux.