Next.js項(xiàng)目中使用SQLite的實(shí)現(xiàn)示例
無論你是做一個(gè)MVP,還是完整的 Web 應(yīng)用,存儲(chǔ)和讀取數(shù)據(jù)都至關(guān)重要。SQLite 是一款可移植、零配置的輕型數(shù)據(jù)庫,能讓你快速上手。
1. 為什么要在 Next.js 中使用 SQLite?
- Next.js 是構(gòu)建服務(wù)端器 React 框架,自動(dòng)處理路由、SSR、代碼分割等。
- SQLite 是一款文件型 SQL 數(shù)據(jù)庫引擎,輕量、快速且零配置。
Next.js + SQLite 的優(yōu)勢:
- 簡單設(shè)置:SQLite 只是普通文件存儲(chǔ),無需運(yùn)行復(fù)雜的數(shù)據(jù)庫服務(wù)器。
- 客戶端查詢:可直接在 Next.js 應(yīng)用中執(zhí)行查詢,無需額外后端。
- 離線持久化:用戶短暫離線后數(shù)據(jù)依然存在。
- 可移植性:數(shù)據(jù)庫文件可在不同環(huán)境與平臺(tái)間輕松遷移。
- 可擴(kuò)展性:SQLite 足夠應(yīng)付大多數(shù)簡單查詢需求,后期可平滑遷移到 Postgres、MySQL 等。
在快速原型階段,SQLite 讓你無需搭建獨(dú)立數(shù)據(jù)庫服務(wù)器即可驗(yàn)證核心功能。
2. 安裝依賴
在 Next.js 中使用 SQLite,需安裝以下依賴:
npm install sqlite3 npm install @mapbox/node-sqlite3 npm install sqlite
3. 創(chuàng)建數(shù)據(jù)庫
在 pages/api 目錄下新建 db.js:
// pages/api/db.js
import sqlite3 from 'sqlite3'
import { open } from 'sqlite'
// 打開 SQLite 數(shù)據(jù)庫連接
export async function openDb() {
return open({
filename: './mydb.db',
driver: sqlite3.Database
})
}
該文件會(huì)在項(xiàng)目根目錄創(chuàng)建名為 mydb.db 的 SQLite 文件。若文件不存在,首次連接時(shí)會(huì)自動(dòng)創(chuàng)建。
4. 定義表結(jié)構(gòu)
在 pages/api 目錄下創(chuàng)建 seed.js,用于初始化數(shù)據(jù)庫表:
// pages/api/seed.js
import { openDb } from './db'
async function setup() {
const db = await openDb()
// 創(chuàng)建 posts 表
await db.exec(`
CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
content TEXT
);
`)
// 插入示例數(shù)據(jù)
await db.run(
'INSERT INTO posts (title, content) VALUES (?, ?)',
'Hello World',
'My first blog post!'
)
await db.close()
}
setup().catch(err => console.error(err.message))
運(yùn)行腳本:
node pages/api/seed.js
至此,數(shù)據(jù)庫與表已準(zhǔn)備就緒。
5. 獲取數(shù)據(jù)(服務(wù)端渲染)
在 pages/index.js 中利用 getServerSideProps 查詢數(shù)據(jù)并傳給組件:
// pages/index.js
import { openDb } from './api/db'
export async function getServerSideProps() {
const db = await openDb()
const posts = await db.all('SELECT * FROM posts')
await db.close()
return {
props: { posts }
}
}
function Home({ posts }) {
// 在 UI 中渲染 posts
return (
<div>
<h1>Posts</h1>
<ul>
{posts.map(p => (
<li key={p.id}>
<h2>{p.title}</h2>
<p>{p.content}</p>
</li>
))}
</ul>
</div>
)
}
export default Home
6. 實(shí)現(xiàn) CRUD 操作
6.1 創(chuàng)建(Create)
pages/api/posts/create.js:
import { openDb } from '../db'
export default async function handler(req, res) {
const { title, content } = req.body
const db = await openDb()
const result = await db.run(
'INSERT INTO posts (title, content) VALUES (?, ?)',
[title, content]
)
await db.close()
res.status(201).json(result)
}
6.2 讀?。≧ead)
pages/api/posts/[id].js:
import { openDb } from '../../db'
export default async function handler(req, res) {
const id = req.query.id
const db = await openDb()
const post = await db.get('SELECT * FROM posts WHERE id = ?', [id])
await db.close()
res.status(200).json(post)
}
6.3 更新(Update)
pages/api/posts/update.js:
import { openDb } from '../db'
export default async function handler(req, res) {
const { id, title, content } = req.body
const db = await openDb()
await db.run(
`UPDATE posts SET title = ?, content = ? WHERE id = ?`,
[title, content, id]
)
await db.close()
res.status(200).json({ message: 'Post updated' })
}
6.4 刪除(Delete)
pages/api/posts/delete.js:
import { openDb } from '../db'
export default async function handler(req, res) {
const { id } = req.body
const db = await openDb()
await db.run('DELETE FROM posts WHERE id = ?', [id])
await db.close()
res.status(200).json({ message: 'Post deleted' })
}
7. 客戶端數(shù)據(jù)獲?。⊿WR/React Query)
暴露統(tǒng)一的 /api/posts 端點(diǎn):
// pages/api/posts.js
import { openDb } from './db'
export default async function handler(req, res) {
const db = await openDb()
const posts = await db.all('SELECT * FROM posts')
await db.close()
res.status(200).json(posts)
}
在客戶端組件中:
useEffect(() => {
async function fetchPosts() {
const res = await fetch('/api/posts')
const posts = await res.json()
// 更新組件狀態(tài)
}
fetchPosts()
}, [])
到此這篇關(guān)于Next.js項(xiàng)目中使用SQLite的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Next.js使用SQLite內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js前端如何寫一個(gè)精確的倒計(jì)時(shí)代碼
關(guān)于寫倒計(jì)時(shí)大家可能都都比較熟悉,使用 setTimeout 或 setInterval 就可以搞定。幾秒鐘或者幾分鐘的倒計(jì)時(shí)這樣寫沒有問題,但是如果是長時(shí)間的倒計(jì)時(shí),這樣寫就會(huì)不準(zhǔn)確2019-10-10
javascript下有關(guān)dom以及xml節(jié)點(diǎn)訪問兼容問題
javascript下有關(guān)dom以及xml節(jié)點(diǎn)訪問兼容問題...2007-11-11
多種方法實(shí)現(xiàn)JS動(dòng)態(tài)添加事件
JS動(dòng)態(tài)添加事件的方法有很多,我們可以使用setAttribute、attachEvent 和 addEventListener等等,感興趣的朋友可以參考下2013-11-11
JavaScript實(shí)現(xiàn)微信小程序打卡時(shí)鐘項(xiàng)目實(shí)例
這篇文章主要為大家介紹了JavaScript實(shí)現(xiàn)微信小程序打卡時(shí)鐘項(xiàng)目實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
JavaScript中常見的數(shù)據(jù)格式化方式詳解
這篇文章主要為大家詳細(xì)介紹了JavaScript中常見的數(shù)據(jù)格式化方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-12-12

