Tutorial Promise & Then in Node.js
Tutorial mengatasi callback dengan promise & then javascript pada Node.ks
Heyho gengs! Pada kali ini gue akan share tentang tutorial promise — then nya javascript yang gue pake di Node.js.
NOTICE: Tutorial ini adalah lanjutan dari tutorial RESTful API NODE JS CRUD. Jika agan belum pernah ngoding CRUD Node.js, saya sarankan kesana terlebih dahulu biar enggak bingung.
Nah pada tutorial kali ini gue akan gambarin kalian kasus seperti apa yang akan digunakan hingga harus menggunakan promise & then.
Tutorial ini dapat dibilang ya agak mirip sama tutorial Promise & Await Node JS, tapi ini kembali lagi ke agan lebih cocok pake yang mana.
Kita akan memiliki dua table, table pertama kita beri nama users untuk table pengguna, lalu table kedua kita beri nama barang untuk table barang. Pada table users, terdapat kolom is_admin yang digunakan untuk memeriksa apakah pengguna tersebut adalah admin atau user biasa. Biasanya saya menggunakan parameter 1 dan 0 yang berarti 1 adalah true, dan 0 adalah false.
Nah kasusnya adalah ketika kita ingin menambahkan barang maka kita harus memeriksa id pengguna yang dikirimkan melalui POST. Kita akan memeriksa apakah ID tersebut sebagai admin, atau bukan.
Oleh karena itu silahkan copy saja .sql nya dibawah ini
-- MySQL dump 10.13 Distrib 5.7.22, for Linux (x86_64)
--
-- Host: localhost Database: toko_online
-- ------------------------------------------------------
-- Server version 5.7.22-0ubuntu18.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `barang`
--
DROP TABLE IF EXISTS `barang`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `barang` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(205) NOT NULL,
`stock` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `barang`
--
LOCK TABLES `barang` WRITE;
/*!40000 ALTER TABLE `barang` DISABLE KEYS */;
INSERT INTO `barang` VALUES (1,'Odol',100),(2,'Sabun',120),(3,'Sikat Gigi',10);
/*!40000 ALTER TABLE `barang` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(230) NOT NULL,
`is_admin` char(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `users`
--
LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (1,'Kiddy','1'),(2,'Budi','0'),(3,'Andi','0'),(4,'Charli','1');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2018-11-18 4:13:32
Nah kalo udah terbuat 2 table beserta isi dari table users, maka kita dapat segera memulai tutorial ini.
Agan dapat membuat file controller baru atau agan dapat menggunakan controller.js yang lama dan ubah menjadi seperti ini.
'use strict';
var response = require('./res');
var connection = require('./conn');
exports.createProduct = function(req, res) {
var product_name = req.body.product_name;
var stock = req.body.stock;
var user_id = req.body.user_id;
var promise1 = new Promise(function(resolve, reject) {
connection.query('SELECT * FROM users where id = ?',
[ user_id ], function (error, rows, fields){
if(error){
console.log(error)
}
resolve(rows);
});
});
promise1.then(function (resolve, reject) {
if(resolve[0].is_admin !== "1"){
response.ok("Prohibited!",res);
return false;
}
var promise2 = new Promise(function(resolve, reject) {
connection.query('INSERT INTO barang (name, stock) values (?,?)',
[ product_name, stock ], function (error, rows, fields){
if(error){
console.log(error)
}
resolve(rows.affectedRows > 0);
});
});
return promise2;
}).then(function (result) {
console.log(result);
(result) ? response.ok("Success",res) : response.ok("failed",res);
return true;
});
};
NOTICE:
Pada promise pertama kita akan melakukan select where pada pengguna dengan user ID yang kita masukkan lewat POSTMAN dan sejenisnya. Setelah pengguna tersebut ditemukan maka resolve akan membalikkan hasil dari database. Promise yang pertama dapat kita teruskan dengan fungsi
.then(function(values){
//TODO: Input your code Here
});
yang berarti kita akan melanjutkan pekerjaan si promise tersebut hingga titik penghabisan, anjas~
Nah pada var promise2 kita akan melakukan promise terlebih dahulu agar callback dari barang yang kita insert dapat selesai terlebih dahulu sebelum dilanjutkan pada then() selanjutnya.
fungsi then() yang terakhir hanyalah memeriksa apakah result yang dibalikkan dari then() sebelumnya bernilai true atau false lalu akan melemparkan response berupa JSON.
Setelah rampung kita rapihkan routes kita di routes.js dan pastikan agan memiliki routes sebagai berikut:
'use strict';
module.exports = function(app) {
var routes = require('./controller');
app.route('/product')
.post(routes.createProduct);
};
Kalo udah rampung saatnya jalanin dengan command:
node server.js
Then let’s try our code!
Jika agan menggunakan user_id 1 yang bernama Kiddy maka agan akan mendapatkan return “Success” karena is_admin user_id 1 adalah 1 atau true (dia adalah admin). Namun apabila agan menggunakan user_id 2 yang dia adalah bukan admin. Maka hasilnya akan seperti ini.
Values yang dikembalikan bernilai prohibited yang berarti user tersebut dilarang menambahkan produk dikarenakan user tersebut bukanlah admin.
Tutorial ini dapat dikembangkan dan dapat diolah sesuai kebutuhan agan-agan sekalian, jadi silahkan di improve sendiri dan disesuaikan dengan kebutuhan agan-agan sekalian.
Akhir kata saya ucapkan terimakasih dan semoga membantu! ^^
Happy Coding!~