資料庫
資料庫
Fastify 的生態系統提供了一些外掛程式,用於連接各種資料庫引擎。本指南涵蓋了在 Fastify 組織內維護 Fastify 外掛程式的引擎。
如果您選擇的資料庫沒有外掛程式,您仍然可以使用該資料庫,因為 Fastify 與資料庫無關。透過參考本指南中列出的資料庫外掛程式範例,可以為缺少的資料庫引擎編寫外掛程式。
如果您想撰寫自己的 Fastify 外掛程式,請查看外掛程式指南
MySQL
執行 npm i @fastify/mysql
來安裝外掛程式。
使用方式
const fastify = require('fastify')()
fastify.register(require('@fastify/mysql'), {
connectionString: 'mysql://root@localhost/mysql'
})
fastify.get('/user/:id', function(req, reply) {
fastify.mysql.query(
'SELECT id, username, hash, salt FROM users WHERE id=?', [req.params.id],
function onResult (err, result) {
reply.send(err || result)
}
)
})
fastify.listen({ port: 3000 }, err => {
if (err) throw err
console.log(`server listening on ${fastify.server.address().port}`)
})
Postgres
執行 npm i pg @fastify/postgres
來安裝外掛程式。
範例:
const fastify = require('fastify')()
fastify.register(require('@fastify/postgres'), {
connectionString: 'postgres://postgres@localhost/postgres'
})
fastify.get('/user/:id', function (req, reply) {
fastify.pg.query(
'SELECT id, username, hash, salt FROM users WHERE id=$1', [req.params.id],
function onResult (err, result) {
reply.send(err || result)
}
)
})
fastify.listen({ port: 3000 }, err => {
if (err) throw err
console.log(`server listening on ${fastify.server.address().port}`)
})
Redis
執行 npm i @fastify/redis
來安裝外掛程式
使用方式
'use strict'
const fastify = require('fastify')()
fastify.register(require('@fastify/redis'), { host: '127.0.0.1' })
// or
fastify.register(require('@fastify/redis'), { url: 'redis://127.0.0.1', /* other redis options */ })
fastify.get('/foo', function (req, reply) {
const { redis } = fastify
redis.get(req.query.key, (err, val) => {
reply.send(err || val)
})
})
fastify.post('/foo', function (req, reply) {
const { redis } = fastify
redis.set(req.body.key, req.body.value, (err) => {
reply.send(err || { status: 'ok' })
})
})
fastify.listen({ port: 3000 }, err => {
if (err) throw err
console.log(`server listening on ${fastify.server.address().port}`)
})
預設情況下,@fastify/redis
不會在 Fastify 伺服器關閉時關閉客戶端連線。要選擇加入此行為,請像這樣註冊客戶端
fastify.register(require('@fastify/redis'), {
client: redis,
closeClient: true
})
Mongo
執行 npm i @fastify/mongodb
來安裝外掛程式
使用方式
const fastify = require('fastify')()
fastify.register(require('@fastify/mongodb'), {
// force to close the mongodb connection when app stopped
// the default value is false
forceClose: true,
url: 'mongodb://mongo/mydb'
})
fastify.get('/user/:id', async function (req, reply) {
// Or this.mongo.client.db('mydb').collection('users')
const users = this.mongo.db.collection('users')
// if the id is an ObjectId format, you need to create a new ObjectId
const id = this.mongo.ObjectId(req.params.id)
try {
const user = await users.findOne({ id })
return user
} catch (err) {
return err
}
})
fastify.listen({ port: 3000 }, err => {
if (err) throw err
})
LevelDB
執行 npm i @fastify/leveldb
來安裝外掛程式
使用方式
const fastify = require('fastify')()
fastify.register(
require('@fastify/leveldb'),
{ name: 'db' }
)
fastify.get('/foo', async function (req, reply) {
const val = await this.level.db.get(req.query.key)
return val
})
fastify.post('/foo', async function (req, reply) {
await this.level.db.put(req.body.key, req.body.value)
return { status: 'ok' }
})
fastify.listen({ port: 3000 }, err => {
if (err) throw err
console.log(`server listening on ${fastify.server.address().port}`)
})
為資料庫程式庫撰寫外掛程式
我們也可以為資料庫程式庫撰寫外掛程式(例如 Knex、Prisma 或 TypeORM)。在我們的範例中,我們將使用 Knex。
'use strict'
const fp = require('fastify-plugin')
const knex = require('knex')
function knexPlugin(fastify, options, done) {
if(!fastify.knex) {
const knex = knex(options)
fastify.decorate('knex', knex)
fastify.addHook('onClose', (fastify, done) => {
if (fastify.knex === knex) {
fastify.knex.destroy(done)
}
})
}
done()
}
export default fp(knexPlugin, { name: 'fastify-knex-example' })
為資料庫引擎撰寫外掛程式
在此範例中,我們將從頭開始建立基本的 Fastify MySQL 外掛程式(這是一個精簡的範例,請在生產環境中使用官方外掛程式)。
const fp = require('fastify-plugin')
const mysql = require('mysql2/promise')
function fastifyMysql(fastify, options, done) {
const connection = mysql.createConnection(options)
if (!fastify.mysql) {
fastify.decorate('mysql', connection)
}
fastify.addHook('onClose', (fastify, done) => connection.end().then(done).catch(done))
done()
}
export default fp(fastifyMysql, { name: 'fastify-mysql-example' })
遷移
資料庫結構描述遷移是資料庫管理和開發不可或缺的一部分。遷移提供了一種可重複且可測試的方式來修改資料庫的結構描述並防止資料遺失。
如本指南開頭所述,Fastify 與資料庫無關,任何 Node.js 資料庫遷移工具都可以與它一起使用。我們將提供一個使用 Postgrator 的範例,它支援 Postgres、MySQL、SQL Server 和 SQLite。對於 MongoDB 遷移,請查看 migrate-mongo。
Postgrator
Postgrator 是一個 Node.js SQL 遷移工具,它使用 SQL 腳本目錄來變更資料庫結構描述。遷移資料夾中的每個檔案都需要遵循以下模式: [版本].[動作].[可選描述].sql
。
版本: 必須是遞增的數字(例如 001
或時間戳記)。
動作: 應為 do
或 undo
。do
實作該版本,undo
還原它。把它想像成其他遷移工具中的 up
和 down
。
可選描述 描述遷移所做的變更。雖然是可選的,但應將其用於所有遷移,因為它使每個人都更容易知道遷移中進行了哪些變更。
在我們的範例中,我們將進行單一遷移,建立一個 users
表格,並且我們將使用 Postgrator
來執行遷移。
執行
npm i pg postgrator
來安裝範例所需的依賴項。
// 001.do.create-users-table.sql
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY NOT NULL,
created_at DATE NOT NULL DEFAULT CURRENT_DATE,
firstName TEXT NOT NULL,
lastName TEXT NOT NULL
);
const pg = require('pg')
const Postgrator = require('postgrator')
const path = require('node:path')
async function migrate() {
const client = new pg.Client({
host: 'localhost',
port: 5432,
database: 'example',
user: 'example',
password: 'example',
});
try {
await client.connect();
const postgrator = new Postgrator({
migrationPattern: path.join(__dirname, '/migrations/*'),
driver: 'pg',
database: 'example',
schemaTable: 'migrations',
currentSchema: 'public', // Postgres and MS SQL Server only
execQuery: (query) => client.query(query),
});
const result = await postgrator.migrate()
if (result.length === 0) {
console.log(
'No migrations run for schema "public". Already at the latest one.'
)
}
console.log('Migration done.')
process.exitCode = 0
} catch(err) {
console.error(err)
process.exitCode = 1
}
await client.end()
}
migrate()