Node.JS #
Pengantar Node.JS #
Node.JS #
Node.js adalah runtime environment untuk JavaScript. Sama halnya dengan .NET ataupun JRE pada Java.
Dulu, javascript hanya bisa dieksekusi di browser dan hanya untuk frontend saja. Sekarang dengan Node.js, kita dapat menjalankan kode JavaScript di mana pun (frontend maupun backend), tidak hanya terbatas pada lingkungan browser saja.
NPM #
NPM adalah Node Package Manager. Digunakan untuk berbagi tool, menginstal modul, dan mengelola dependensi.
Express #
Express adalah framework aplikasi web Node.js. Bagus untuk membuat API karena minimal, cepat dan mudah.
Perintah Command Line #
Install Node.JS #
Ubuntu
sudo apt install nodejs
Cek Versi
npm -v
Membuat package.json
npm init -y
Install NPM #
Ubuntu
sudo apt install npm
Cek Versi
node -v
Initiate node.js file (Run Server Otomatis) #
File yang dibuat harus di-inisiasi dulu oleh node.js sebelum action lain dijalankan.
node app.js
Membuat Server Node.JS #
const http = require('http');
const hostname = 'sipkd.madiunkota.go.id';
const port = 3000;
const server = http.createServer((req, res) => {
res.writeHead(200,{
"Content-Type" : "text/html"
});
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Jalankan di terminal dengan perintah ‘node app.js’
Node.JS MySql #
npm install mysql
Membuat koneksi :
buatlah file koneksi.js
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "yourusername",
password: "yourpassword"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
Jalankan di terminal dengan perintah ‘node koneksi.js’
CRUD Node.JS, Express, Bootstrap & MySQL #
-
Siapkan (download) bootstrap & jquery
-
Siapkan database dan table mysql
nama db: example nama table: user field: id, username, password
-
Buat folder project
nama folder: crud
-
Buat package.json
jalankan perintah command line berikut di dalam folder project.
npm initPerintah diatas akan membuat sebuah file bernama package.json secara otomatis pada project Anda.
-
Install dependencies
Dependencies disini adalah fitur pendukung (seperti: framework, driver, middleware, template) yang harus disediakan untuk menyempurnakan alur aplikasi. Dependencies yang dibutuhkan adalah :
- Express (node.js web framework)
- MySQL (driver mysql untuk node.js)
- Body-parser (middleware untuk menjalankan post body request)
- Handlebars (template engine (seperti blade di laravel) )
Instal dependencies yang dibutuhkan dengan mengetik perintah berikut.
npm install --save express mysql body-parser hbsPerintah diatas akan menginstall semua dependencies yang kita butuhkan yaitu: express, mysql, body-parser, dan handlebars. Kita bisa pantau dependencies yang terinstall di dalam file package.json.
-
Struktur Project
Buat folder public dan views di dalam project folder crud.
Buat folder css dan js di dalam folder public.
Copy file-file bootstrap.css yang telah di download sebelumnya kedalam folder public/css/.
Copy file-file bootstrap.js dan jquery pada folder public/js/.
-
Index.js
Buat file dengan nama index.js di dalam folder project crud. Ketikkan kode berikut.
//use path module const path = require('path'); //use express module const express = require('express'); //use hbs view engine const hbs = require('hbs'); //use bodyParser middleware const bodyParser = require('body-parser'); //use mysql database const mysql = require('mysql'); const app = express(); //konfigurasi koneksi const conn = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'example' }); //connect ke database conn.connect((err) => { if (err) throw err; console.log('Mysql Connected...'); }); //set views file app.set('views', path.join(__dirname, 'views')); //set view engine app.set('view engine', 'hbs'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); //set folder public sebagai static folder untuk static file app.use('/assets', express.static(__dirname + '/public')); //route untuk homepage app.get('/', (req, res) => { let sql = "SELECT * FROM user"; let query = conn.query(sql, (err, results) => { if (err) throw err; res.render('user_view', { results: results }); }); }); //route untuk insert data app.post('/save', (req, res) => { let data = { username: req.body.username, password: req.body.password }; let sql = "INSERT INTO user SET ?"; let query = conn.query(sql, data, (err, results) => { if (err) throw err; res.redirect('/'); }); }); //route untuk update data app.post('/update', (req, res) => { let sql = "UPDATE user SET username='" + req.body.username + "', password='" + req.body.password + "' WHERE id=" + req.body.id; let query = conn.query(sql, (err, results) => { if (err) throw err; res.redirect('/'); }); }); //route untuk delete data app.post('/delete', (req, res) => { let sql = "DELETE FROM user WHERE id=" + req.body.id + ""; let query = conn.query(sql, (err, results) => { if (err) throw err; res.redirect('/'); }); }); //server listening app.listen(8000, () => { console.log('Server is running at port 8000'); }); -
View
Buat file dengan nama user_view.hbs didalam folder views. Lalu ketikkan kode berikut.
<html lang="en"> <head> <meta charset="utf-8"> <title>CRUD Node.js and Mysql</title> <link href="/assets/css/bootstrap.css" rel="stylesheet" type="text/css" /> </head> <body> <div class="container"> <h2>User List</h2> <button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#myModalAdd"> Add New </button> <table class="table table-striped" id="mytable"> <thead> <tr> <th>ID</th> <th>Username</th> <th>Password</th> <th>Action</th> </tr> </thead> <tbody> {{#each results}} <tr> <td>{{ id }}</td> <td>{{ username }}</td> <td>{{ password }}</td> <td> <a href="javascript:void(0);" class="btn btn-sm btn-info edit" data-id="{{ id }}" data-username="{{ username }}" data-password="{{ password }}">Edit</a> <a href="javascript:void(0);" class="btn btn-sm btn-danger delete" data-id="{{ id }}">Delete</a> </td> </tr> {{/each}} </tbody> </table> </div> <!-- Modal Add Produk--> <div class="modal fade" id="myModalAdd" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <form action="/save" method="post"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Add New User</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="form-group"> <input type="text" name="username" class="form-control" placeholder="Nama User" required> </div> <div class="form-group"> <input type="text" name="password" class="form-control" placeholder="Password" required> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="submit" class="btn btn-primary">Save</button> </div> </div> </div> </form> </div> <!-- Modal Update Produk--> <form action="/update" method="post"> <div class="modal fade" id="EditModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Edit Product</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="form-group"> <input type="text" name="username" class="form-control username" placeholder="Nama User" required> </div> <div class="form-group"> <input type="text" name="password" class="form-control password" placeholder="Password" required> </div> </div> <div class="modal-footer"> <input type="hidden" name="id" class="id"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="submit" class="btn btn-primary">Update</button> </div> </div> </div> </div> </form> <!-- Modal Delete Produk--> <form id="add-row-form" action="/delete" method="post"> <div class="modal fade" id="DeleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="myModalLabel">Delete User</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <strong>Anda yakin mau menghapus data ini?</strong> </div> <div class="modal-footer"> <input type="hidden" name="id" class="form-control id2" required> <button type="button" class="btn btn-default" data-bs-dismiss="modal">Close</button> <button type="submit" class="btn btn-success">Delete</button> </div> </div> </div> </div> </form> <script src="/assets/js/jquery-3.6.0.js"></script> <script src="/assets/js/bootstrap.js"></script> <script> $(document).ready(function () { //tampilkan data ke modal untuk edit $('#mytable').on('click', '.edit', function () { var id = $(this).data('id'); var username = $(this).data('username'); var password = $(this).data('password'); $('#EditModal').modal('show'); $('.username').val(username); $('.password').val(password); $('.id').val(id); }); //tampilkan modal hapus record $('#mytable').on('click', '.delete', function () { var id = $(this).data('id'); $('#DeleteModal').modal('show'); $('.id2').val(id); }); }); </script> </body>-
Testing
Uji coba dengan perintah berikut.
node index
-
MVC #
-
Tambahkan kode berikut pada file “package.json” (dibawah variabel “main”):
"type": "module", -
Tambahkan folder route setara dengan folder node_modules.
-
Buat file route.js di dalam folder route. Ketikkan kode berikut.
//import express const express = require('express'); // init express router const router = express.Router(); // Home route router.get('/', (req, res) => { res.send('Welcome to Home Page'); }); // About route router.get('/about', (req, res) => { res.send('Welcome to About Page'); }); // Contact route router.get('/contact', (req, res) => { res.send('Welcome to Contact Page'); }); // export default router module.exports = router; -
Ketik pada index.js
//import express const express = require('express'); // init express const app = express(); const router = require('./routes/routes'); // const routeUser = require('./routes/user'); // Use Router app.use('/', router); // app.use('/user', routeUser); // listen on port app.listen(3000, () => console.log('Server Running at http://localhost:3000')); -
Jalankan sesuai route yang dibuat.
Full Stack Express, Vue, MySQL, MVC #
Backend #
-
Buat folder “backend”. Kemudian jalankan npm init -y di terminal untuk membuat package.json.
-
Selanjutnya, install express, mysql2, dan cors dengan mengetikan perintah berikut.
npm install express mysql2 cors -
Tambahkan kode berikut pada file “package.json” (dibawah baris “main”).
"type": "module", -
Terapkan MVC. Buat folder “config”, “controllers”, “models”, dan “routes” di dalam folder “backend”.
-
Buat file “database.js” di dalam folder “config”, buat file “user.js” di dalam folder “controllers”, buat file “userModel.js” di dalam folder “models”, buat file “routes.js” di dalam folder “routes”, dan buat file “index.js” di dalam folder “backend”.
Frontend #
-
Tambahkan kode berikut pada file “package.json” (dibawah variabel “main”):
"type": "module",
HBS (Handlebars) #
- npm init -y
- npm install express express-handlebars nodemon body-parser –save
- buat folder public & views setara node_modules, buat folder layouts & partials
- buat index.hbs di dalam folder layouts, main.hbs di dalam folder views, index.js setara dengan node_modules
Question & Answer #
NPM ERR: npm : Depends: node-gyp #
Install manual package node.js yang kurang
sudo apt-get install nodejs-dev node-gyp libssl1.0-dev
Format Date Time #
Format date time default pada nodejs “Tue Oct 12 2021 00:00:00 GMT+0700 (WIB)”. tambahkan package momentjs untuk Parse, validate, manipulate, dan display dates and times di JavaScript.
npm install moment