※ 認識Knex.js:
Knex.js是一個專門串接資料庫的抽象化層,它支援多種關聯式資料庫,包括 PostgreSQL、MySQL、MariaDB、SQLite3、Oracle 和 Amazon Redshift 等。好處是連接以上的資料庫時,可以直接使用Knex.js的語法,就會自動創建出相對應的資料庫語法。在進行資料庫遷移時,只需要小幅度的修改,而不需要重寫大部分的程式碼,這就是抽象隔離層的其中一個好處。
※ Knex.js官方指導書:
https://knexjs.org/guide/
※ 下載Knex.js:
npm install knex --save
※ 下載MySQL:
npm install mysql

※ 建立 Knex.js和 MySQL 連接:
在 utils 中建立 index.ts檔案 Knex.js來和 MySQL 連接:utils --> index.ts

導入 Knex.js:
import knex, { Knex } from "knex";
建立資料庫連接函數:
export const createDatabase = () => {
return knex({
client: 'mysql',
connection: {
host: '127.0.0.1',
port: 3306,
user: 'your_database_user',
password: 'your_database_password',
database: 'myapp_test',
},
pool: {
min: 0,
max: 5
}
});
}
程式碼說明:
- export const createDatabase = () => { ... }:這行代碼導出了一個函數 createDatabase,用於建立資料庫連接。
- client: 'mysql':指定使用 MySQL 作為資料庫客戶端。
- connection:設置資料庫連接參數,包括主機、端口、用戶名、密碼和資料庫名稱。
- host: '127.0.0.1':資料庫伺服器的主機地址。
- port: 3306:資料庫伺服器的端口號。
- user: 'root':資料庫用戶名。
- password: 資料庫用戶密碼。
- database: 資料庫名稱。
- pool:設置連接池的參數,用於管理資料庫連接,減少重新連線的成本。
- min: 0:最小連接數量。
- max: 5:最大連接數量。
新增database連線:views --> app.ts
import { Knex } from 'knex';
import { createDatabase } from './utils';
class App {
public app: express.Application;
private knexSql: Knex;//新增
constructor() {
this.app = express();
this.config();
this.knexSql = createDatabase();//新增
this.routerSetup();
this.errorHandler();
}
}
程式碼說明:
在class App應用程式的入口點新增與資料庫連線有關的程式碼:
private knexSql: Knex;
:
定義了一個名為 knexSql
的私有屬性,其類型是 Knex
。這表示這個屬性會儲存一個 Knex 實例,用於與資料庫進行互動。
this.knexSql = createDatabase();
:
在constructor(建構函數)中,將 knexSql
屬性初始化為 createDatabase()
函數的返回值,並且配置好資料庫連接資訊。
從 products 資料表中選取數據:views --> app.ts
class App {
constructor() {
this.knexSql
.select()
.from('products')
.then((result) => {
console.log(result);
});
}}
程式碼說明:
建構函數會自動查詢 products 資料表並將結果輸出到控制台。
database連線結果:

※ 設定環境變數:
建立environment(.env)設定檔:
安全性:環境變數可以用來存儲敏感訊息,減少洩露的風險。
配置管理:根據不同的環境(如開發、測試和生產)設置不同的變數值。
靈活性:透過環境變數,可以方便地調整應用程式的行為而不需要修改代碼。
方便管理:使用環境變數可以讓配置集中管理,便於維護和更新。

- .env檔案內容:
DATABASE_HOST ="127.0.0.1"
DATABASE_PORT ="3306"
DATABASE_USER ="root"
DATABASE_PASSWORD ="password"
DATABASE_DATABASE ="payment"
讀取 .env 文件中的變數:utils --> index.ts
- index.ts檔案內容:
export const createDatabase = () => {
return knex({
client: 'mysql',
connection: {
//修改
host: process.env.DATABASE_HOST || '127.0.0.1',
port: Number(process.env.DATABASE_PORT) || 3306,
user: process.env.DATABASE_USER || 'root',
password: process.env.DATABASE_PASSWORD || 'password',
database: process.env.DATABASE_DATABASE || 'payment'
},
pool: { min: 2, max: 5 },
})
}
※ 下載dotenv:
目的是用 dotenv 來讀取.env
檔案中的環境變數,並將它們加載到 process.env 中。
npm install dotenv
www.ts檔中引入 dotenv :程式碼執行的最開頭( bin--> www.ts)
import { config } from 'dotenv';
config();
※ www.ts檔案介紹:
www.ts
是應用程式的入口點,啟動伺服器。
- 負責啟動伺服器,設置伺服器監聽的端口,並處理伺服器相關的錯誤和事件。
- 一般用於初始化和管理伺服器進程。
※ www.ts檔案內容:
- 載入模組:引用應用程序和其他所需模組。
import app from './app';
import http from 'http';
- 設定埠號:設置伺服器運行的埠號。
const port = process.env.PORT || 3000;
app.set('port', port);
- 建立 HTTP 伺服器:建立一個 HTTP 伺服器來處理請求。
const server = http.createServer(app);
- 監聽事件:監聽伺服器事件,如啟動成功、錯誤處理等。
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
function onError(error: NodeJS.ErrnoException): void {
if (error.syscall !== 'listen') {
throw error;
}
const bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
switch (error.code) {
case 'EACCES':
console.error(`${bind} requires elevated privileges`);
process.exit(1);
break;
case 'EADDRINUSE':
console.error(`${bind} is already in use`);
process.exit(1);
break;
default:
throw error;
}
}
function onListening(): void {
const addr = server.address();
const bind = typeof addr === 'string'
? `pipe ${addr}`
: `port ${addr.port}`;
console.log(`Listening on ${bind}`);
}
- 啟動伺服器:最終啟動伺服器並開始監聽請求。