Knex.js是一個專門串接資料庫的抽象化層,它支援多種關聯式資料庫,包括 PostgreSQL、MySQL、MariaDB、SQLite3、Oracle 和 Amazon Redshift 等。好處是連接以上的資料庫時,可以直接使用Knex.js的語法,就會自動創建出相對應的資料庫語法。在進行資料庫遷移時,只需要小幅度的修改,而不需要重寫大部分的程式碼,這就是抽象隔離層的其中一個好處。
npm install knex --save
npm install mysql
import knex, { Knex } from "knex";
export const createDatabase = () => {
return knex({
client: 'mysql',
connection: {
host: '127.0.0.1',
port: 3306,
user: 'root',
password: 'password',
database: 'xue_mi'
},
pool: {
min: 0,
max: 5
}
});
}
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();
this.knexSql
.select()
.from('products')
.then((result) => {
console.log(result)
})//新增
}
}
目的是定義資料庫的設定。
DATABASE_HOST = '127.0.0.1'
DATABASE_PORT = 3306
DATABASE_USER = 'root'
DATABASE_PASSWORD = 'password'
DATABASE_DATABASE = 'xuemi'
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 || 'xuemi'
},
pool: {
min: 0,
max: 5
}
})
}
目的是用 dotenv 來讀取.env
檔案中的環境變數,並將它們加載到 process.env 中。
npm install dotenv
import { config } from 'dotenv';
config();
www.ts
是應用程式的入口點,啟動伺服器。
import app from './app';
import http from 'http';
const port = process.env.PORT || 3000;
app.set('port', port);
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}`);
}