{"id":19754912,"url":"https://github.com/sofyansetiawan/lecture-mvc-express-postgresql","last_synced_at":"2026-03-06T19:35:04.066Z","repository":{"id":42744421,"uuid":"281336457","full_name":"sofyansetiawan/lecture-mvc-express-postgresql","owner":"sofyansetiawan","description":"lecture notes for MVC Express.js Nodejs PostgreSQL","archived":false,"fork":false,"pushed_at":"2022-12-13T08:31:31.000Z","size":160,"stargazers_count":4,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-27T22:48:18.929Z","etag":null,"topics":["express","nodejs","postgresql"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sofyansetiawan.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-21T08:10:20.000Z","updated_at":"2023-10-18T05:54:32.000Z","dependencies_parsed_at":"2023-01-28T09:45:34.167Z","dependency_job_id":null,"html_url":"https://github.com/sofyansetiawan/lecture-mvc-express-postgresql","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sofyansetiawan/lecture-mvc-express-postgresql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sofyansetiawan%2Flecture-mvc-express-postgresql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sofyansetiawan%2Flecture-mvc-express-postgresql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sofyansetiawan%2Flecture-mvc-express-postgresql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sofyansetiawan%2Flecture-mvc-express-postgresql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sofyansetiawan","download_url":"https://codeload.github.com/sofyansetiawan/lecture-mvc-express-postgresql/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sofyansetiawan%2Flecture-mvc-express-postgresql/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30193649,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","nodejs","postgresql"],"created_at":"2024-11-12T03:06:25.683Z","updated_at":"2026-03-06T19:35:04.046Z","avatar_url":"https://github.com/sofyansetiawan.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## LECTURE MVC Express PG\n\n\n### SLIDE\n\n- Storage persistent penyimpanan tetap permanen (misal harddisk) lawannya temporary (RAM)\n\n- SQL banyak jenisnya. Postgres syntax query mirip dan fitur ke semua jenis database SQL\n\n  - PostgreSQL itu open-source / community. MySQL closed source.\n  - PostgreSQL bersifat extensible (shared library)\n\n- Connection Pool (connection bisa di re-use untuk request mendatang) untuk performa\n\n  - Pool membuat kolam yang berisi cached connection\n  - Client masih pakai cara tradisional\n  - Lebih efisien karena kalau client membentuk koneksi dari awal lagi ketika selesai query lalu end hilang dan bikin lagi (20 - 30 mili detik sedikit demi sedikit memperlambat aplikasi)\n  - Ketika request yang sudah terpakai itu tersimpan untuk client tersebut (kalau tidak akan dijalankan secara simultan)\n\n- Pool basic config ada bedanya max jumlah client dan idleTimeout (jika tidak terjadi koneksi maka end otomatis oleh pool)\n\n- Pool berdasarkan config dan tambahi eventlistener connect untuk testing koneksi (gak perlu)\n\n- Pool connect akan ada callback err, client, done\n\n  - client dari callback bisa dipakai untuk query\n\n  - done() mengembalikan client ke pool ketika client sudah selesai query\n\n  - client akan dipakai oleh request yang lain\n\n  - Jadi kita tidak pakai pool.connect tapi yang lebih mudah\n\n    \n\n### DEMO\n\n- Siapkan json data\n- Setup Npm \u0026 Package\n  - npm init -y (nama folder harus URL friendly)\n  - npm install express ejs pg nodemon\n  - .gitignore berisi node_modules\n- MVC + config buat foldernya\n  - mkdir models views controllers routes config\n- Siapkan koneksi ke PG\n  - Di dalam config - touch connection.js\n  - Membuat require pg, config dan instance dari class Pool PostgreSQL lalu exports \n  - (Dokumentasi pg.Pool) tambahkan config 3 properti baru (opsional) kalau tidak diisi akan ada default value\n- Membuat tabel sesuai dari config (melalui GUI atau terminal)\n  - touch setup.js (DDL table)\n  - require pool\n  - Buat table yang sesuai struktur json\n    - Buat string berisi query DDL table\n    - (Dokumentasi Pooling - Single query). Params (query, valuesOptional, callback)\n    - Buat callback hell pool query untuk drop table dan create table\n    - Jalankan setup lalu cek table di GUI\n  - TIPS: Jika ragu SQL nya benar atau salah test dulu di GUI\n- Seeding Data\n  - touch seeding.js\n  - require pool dan fs (baca file json)\n  - fs.readFile untuk membaca json\n    - Jangan lupa JSON.parse\n  - (Dokumentasi insert) untuk query insert data\n  - (Dokumentasi querying) Seeding data dengan parameterized query\n- Setup Express\n  - touch app.js\n  - Buat setup express seperti biasa ditambah View Engine dan Body parser\n  - Require routes (jika require folder otomatis dia akan akses index.js) dan app.use routernya\n- Setup Routes\n  - touch index.js\n    - Require express router dan controller(s)\n    - Require file router lain jika diperlukan lalu router.use\n    - Jangan lupa exports\n  - touch file route yang diperlukan\n    - Code seperti dengan di index.js\n    - Buat struktur route sesuai kebutuhan (add, show, edit, delete)\n- Setup Controller\n  - touch controllers/controller.js\n  - Buat static method sesuai kebutuhan router (struktur dulu belum diisi tidak apa apa. Misal isi res.send() )\n  - Untuk yang sudah diketahui mana yang butuh EJS langsung res.render()\n  - Jangan lupa exports\n- Setup EJS\n  - touch showAll.ejs, addForm.ejs editForm.ejs\n  - Template bisa pakai bootstrap introduction copy HTML basic\n  - Cari button, tabel dan form untuk tampilan\n  - showAll.ejs untuk tabel\n    - Berisi juga link edit dan delete\n  - addForm.ejs, editForm.ejs untuk form\n- Setup Model\n  - touch models/namamodel.js\n  - Require pool connection\n  - Buat class sesuai kebutuhan (bagian addform tidak perlu)\n    - Jika hanya 1 jenis data (1 table) langsung bikin class sebagai class model dan buat constructornya\n    - Jika lebih pisahkan masing masing model\n    - Jika 1 jenis data ada banyak macam (misal kasus Employees) kalian bisa gunakan Factory\n    - Tips: untuk id langsung type coercing ke number dengan `+`\n  - Buat static method di model sesuai kebutuhan di controller (misal dikosongi dulu)\n  - Buat query untuk masing masing static method (ditest di GUI) pakai backtick `\n- Coding Model - Controller - Views\n  - require Model di Controller\n  - Kriteria Callback ada 3\n    - Badan functionCallback menjadi isi argument dari invoke functionUtama\n    - functionUtama menyediakan parameter sebagai jalan masuk functionCallback\n    - functionCallback (nama sudah diwakili parameter) di invoke di dalam badan functionUtama \n    - Buatlah proses callback untuk Controller dan Model\n  - Bisa ambil dari pool.query di setup.js ( tanpa pakai pool.end )\n- ShowData (Select)\n  - Tidak perlu returning\n  - Jangan lupa datanya ada di properti rows\n  - Buat map untuk instantiate class\n  - Render di EJS dengan loop row table\n  - Jangan lupa untuk link edit dan delete bisa gunakan id\n- Add (Create)\n  - Data diterima oleh req.body (sesuai name di form)\n  - Buat dalam object literal lalu masukkan ke static add model\n  - Pakai parameterized query\n  - Jika success, tidak ada data yang diambil callback bisa diisi null\n- Edit (Update)\n  - Harus mendapatkan params id nya\n  - Masukkan ke static edit model\n  - Jangan lupa datanya ada di properti rows[0] (karena tunggal)\n  - Jika success, tidak ada data yang diambil callback bisa diisi null\n  - Data diterima oleh req.body (sesuai name di form) + terima params.id sebagai id\n  - Pakai parameterized query\n  - Jika success, tidak ada data yang diambil callback bisa diisi null\n- Additional\n  - Req.app.locals.message (jika perlu)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsofyansetiawan%2Flecture-mvc-express-postgresql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsofyansetiawan%2Flecture-mvc-express-postgresql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsofyansetiawan%2Flecture-mvc-express-postgresql/lists"}