iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
IT Operation

Docker 新手村:從容器到 PostgreSQL 的實戰之路系列 第 25 篇

Day 24 - PostgreSQL + Node.js:讓程式連上資料庫

  • 分享至 

  • xImage
  •  

學習目標

  • 使用 Node.js 連線 PostgreSQL
  • 認識 Node.js 的 pg 套件
  • 建立資料庫連線設定
  • 使用 Node.js 執行第一個 SQL 查詢
  • 了解程式、PostgreSQL 與 Docker 之間的關係

從手動操作到程式連線

前幾天已經可以透過 psql 和 pgAdmin 操作 PostgreSQL。

但真正製作網站或系統時,不可能每次都自己打開 pgAdmin 新增或查詢資料,而是要讓後端程式自動與資料庫溝通。

今天要加入 Node.js:

Node.js
   │
   ↓
PostgreSQL
   │
   ↓
Database
   │
   ↓
employees

讓程式第一次真正讀取 PostgreSQL 裡面的資料。


建立 Node.js 專案

先建立一個新的資料夾:

node-postgres

進入資料夾後初始化 Node.js:

npm init -y

接著安裝 PostgreSQL 套件:

npm install pg

pg 是 Node.js 常用的 PostgreSQL Client,可以讓 Node.js 與 PostgreSQL 建立連線並執行 SQL。

目前資料夾大致會變成:

node-postgres
│
├── node_modules
├── package.json
├── package-lock.json
└── app.js

接著建立一個 app.js。


建立 PostgreSQL 連線

在 app.js 中加入:

const { Client } = require("pg");

const client = new Client({
  host: "localhost",
  port: 5432,
  user: "myuser",
  password: "123456",
  database: "schedule_db"
});

client.connect()
  .then(() => {
    console.log("PostgreSQL 連線成功!");
  })
  .catch(err => {
    console.error("PostgreSQL 連線失敗:", err);
  });

這裡的設定就是之前使用 pgAdmin 時看過的資料庫連線資訊:

Host:localhost
Port:5432
User:myuser
Password:123456
Database:schedule_db

因為目前 Node.js 是直接執行在自己的電腦上,而 PostgreSQL 有設定:

5432:5432

所以 Node.js 可以透過 localhost:5432 找到 PostgreSQL。


執行 Node.js

在終端機輸入:

node app.js

如果設定正確,應該會看到:

PostgreSQL 連線成功!

這代表目前已經完成:

Node.js
   │
localhost:5432
   │
   ↓
Docker
   │
   ↓
PostgreSQL Container

程式終於真正連進 Docker 裡面的資料庫了。


使用 Node.js 查詢資料

只有成功連線還不夠,接下來嘗試查詢 Day 18 建立的 employees Table。

修改 app.js:

const { Client } = require("pg");

const client = new Client({
  host: "localhost",
  port: 5432,
  user: "myuser",
  password: "123456",
  database: "schedule_db"
});

async function main() {
  try {
    await client.connect();

    console.log("PostgreSQL 連線成功!");

    const result = await client.query(
      "SELECT * FROM employees"
    );

    console.log(result.rows);
  } catch (err) {
    console.error("發生錯誤:", err);
  } finally {
    await client.end();
  }
}

main();

再次執行:

node app.js

如果資料庫中已經有員工資料,就會看到類似:

[
  {
    id: 1,
    name: '小明',
    position: '正職',
    hire_date: ...
  },
  {
    id: 2,
    name: '小美',
    position: '兼職',
    hire_date: ...
  }
]

這些資料就是 PostgreSQL 查詢後回傳給 Node.js 的結果。


client.query 是什麼?

這次使用:

client.query("SELECT * FROM employees")

讓 Node.js 執行 SQL。

也就是:

Node.js
   │
   │ SELECT * FROM employees
   ↓
PostgreSQL
   │
   │ 查詢 employees
   ↓
回傳資料
   │
   ↓
Node.js

所以前面學過的 SQL 並沒有消失,而是改成由程式幫我們執行。


為什麼最後要 client.end?

程式完成查詢後使用:

await client.end();

代表關閉這次 PostgreSQL 連線。

如果只是今天這種簡單測試程式,完成查詢後就可以關閉連線。

之後如果製作真正的 Express API,通常會使用 Connection Pool 管理多個資料庫連線,而不是每次都建立一個新的 Client。


常見錯誤與修正

  • ❌ 出現 Cannot find module 'pg' → ✅ 執行 npm install pg
  • ❌ PostgreSQL 連線失敗 → ✅ 使用 docker ps 確認 Container 是否執行
  • ❌ ECONNREFUSED → ✅ 確認 Host、Port 與 Docker Port Mapping
  • ❌ 密碼驗證失敗 → ✅ 確認 PostgreSQL 的 Username 和 Password
  • ❌ 找不到 employees → ✅ 確認連線的是 schedule_db
  • ❌ 程式執行後一直沒有結束 → ✅ 完成查詢後使用 client.end()

今日小挑戰(可交付)

  • [ ] 建立 Node.js 專案
  • [ ] 使用 npm install pg 安裝套件
  • [ ] 建立 PostgreSQL Client
  • [ ] 成功顯示「PostgreSQL 連線成功」
  • [ ] 使用 SELECT * FROM employees 查詢資料
  • [ ] 在 Node.js 中顯示查詢結果

DAY24 心得

今天第一次讓自己寫的 Node.js 程式真正連上 Docker 裡面的 PostgreSQL。之前不管使用 psql 還是 pgAdmin,都還是自己手動操作資料庫,今天則變成由程式直接執行 SQL。

成功看到 employees 的資料出現在 Node.js 終端機時,也更能理解後端和資料庫之間是怎麼溝通的。

前面學過的 Docker Port、PostgreSQL 帳號密碼以及 SQL,其實全部都在今天串了起來。目前帳號和密碼還直接寫在程式中,這樣在真正的專案裡並不安全,之後還需要把這些設定移到環境變數中,讓整個專案的設定方式更加完整。


上一篇
Day 23 - PostgreSQL + pgAdmin:用 Compose 一次啟動兩個服務
系列文
Docker 新手村:從容器到 PostgreSQL 的實戰之路 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言