pg 套件前幾天已經可以透過 psql 和 pgAdmin 操作 PostgreSQL。
但真正製作網站或系統時,不可能每次都自己打開 pgAdmin 新增或查詢資料,而是要讓後端程式自動與資料庫溝通。
今天要加入 Node.js:
Node.js
│
↓
PostgreSQL
│
↓
Database
│
↓
employees
讓程式第一次真正讀取 PostgreSQL 裡面的資料。
先建立一個新的資料夾:
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。
在 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 app.js
如果設定正確,應該會看到:
PostgreSQL 連線成功!
這代表目前已經完成:
Node.js
│
localhost:5432
│
↓
Docker
│
↓
PostgreSQL Container
程式終於真正連進 Docker 裡面的資料庫了。
只有成功連線還不夠,接下來嘗試查詢 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("SELECT * FROM employees")
讓 Node.js 執行 SQL。
也就是:
Node.js
│
│ SELECT * FROM employees
↓
PostgreSQL
│
│ 查詢 employees
↓
回傳資料
│
↓
Node.js
所以前面學過的 SQL 並沒有消失,而是改成由程式幫我們執行。
程式完成查詢後使用:
await client.end();
代表關閉這次 PostgreSQL 連線。
如果只是今天這種簡單測試程式,完成查詢後就可以關閉連線。
之後如果製作真正的 Express API,通常會使用 Connection Pool 管理多個資料庫連線,而不是每次都建立一個新的 Client。
Cannot find module 'pg' → ✅ 執行 npm install pg
docker ps 確認 Container 是否執行ECONNREFUSED → ✅ 確認 Host、Port 與 Docker Port Mappingemployees → ✅ 確認連線的是 schedule_db
client.end()
npm install pg 安裝套件SELECT * FROM employees 查詢資料今天第一次讓自己寫的 Node.js 程式真正連上 Docker 裡面的 PostgreSQL。之前不管使用 psql 還是 pgAdmin,都還是自己手動操作資料庫,今天則變成由程式直接執行 SQL。
成功看到 employees 的資料出現在 Node.js 終端機時,也更能理解後端和資料庫之間是怎麼溝通的。
前面學過的 Docker Port、PostgreSQL 帳號密碼以及 SQL,其實全部都在今天串了起來。目前帳號和密碼還直接寫在程式中,這樣在真正的專案裡並不安全,之後還需要把這些設定移到環境變數中,讓整個專案的設定方式更加完整。