从零搭建 Express + Prisma + SQLite 后端服务
记录我自己学习的一个过程如有不对可指出谢谢一、新建一个文件夹--我自己建了个“todo-practice”二、打开终端或者cmd---进入到新建的文件cd D:\Projects\todo-practice三、执行初始化命令生成package.jsonnpm init -y四、安装基础依赖包# 安装后端核心框架、JWT 鉴权、密码加密包以及 SQLite 驱动 npm install express cors jsonwebtoken bcryptjs prisma/client # 安装开发环境依赖Prisma 工具和热重载 npm install -D prisma nodemon五、初始化 SQLite 数据库Prismanpx prisma init --datasource-provider sqlite看到Initialized Prisma in your project就说明QLite 数据库配置文件已经成功建好了运行后会发现项目里多了一个prisma/schema.prisma文件这就是定义数据库结构的地方六、配置数据库数据表---打开prisma/schema.prisma文件清空默认代码复制以下代码到schema.prisma中去generator client { provider prisma-client-js } datasource db { provider sqlite } // 用户表 model User { id Int id default(autoincrement()) email String unique password String createdAt DateTime default(now()) todos Todo[] } // 待办事项表 model Todo { id Int id default(autoincrement()) title String completed Boolean default(false) userId Int user User relation(fields: [userId], references: [id]) }七、修改根目录下的prisma7.config.tsimport { defineConfig } from prisma/config export default defineConfig({ datasource: { url: file:./dev.db, }, })八、在终端生成数据库与客户端代码npx prisma db push看到Your database is now in sync with your Prisma schema说明 SQLite 数据库初始化完全成功九、在根目录新建index.js文件const express require(express); const cors require(cors); const jwt require(jsonwebtoken); const bcrypt require(bcryptjs); const { PrismaClient } require(prisma/client); const app express(); const prisma new PrismaClient(); const JWT_SECRET my_super_secret_key_123; // 密钥 app.use(cors()); app.use(express.json()); // 解析 JSON 请求体 // 1. 用户注册接口 app.post(/api/register, async (req, res) { const { email, password } req.body; if (!email || !password) return res.status(400).json({ error: 请提供邮箱和密码 }); try { const hashedPassword await bcrypt.hash(password, 10); const user await prisma.user.create({ data: { email, password: hashedPassword }, }); res.json({ message: 注册成功, userId: user.id }); } catch (error) { res.status(400).json({ error: 邮箱已被注册 }); } }); // 2. 用户登录接口 app.post(/api/login, async (req, res) { const { email, password } req.body; const user await prisma.user.findUnique({ where: { email } }); if (!user || !(await bcrypt.compare(password, user.password))) { return res.status(401).json({ error: 邮箱或密码错误 }); } // 签发 JWT Token const token jwt.sign({ userId: user.id }, JWT_SECRET, { expiresIn: 1d }); res.json({ message: 登录成功, token }); }); // 关键点鉴权中间件拦截未登录请求 const authenticate (req, res, next) { const authHeader req.headers.authorization; if (!authHeader || !authHeader.startsWith(Bearer )) { return res.status(401).json({ error: 未提供 Token 或格式错误 }); } const token authHeader.split( )[1]; try { const payload jwt.verify(token, JWT_SECRET); req.userId payload.userId; // 将解析出的 userId 挂在 req 上 next(); } catch (error) { res.status(401).json({ error: Token 无效或已过期 }); } }; // 3. 创建 Todo 接口使用了 authenticate 鉴权中间件 app.post(/api/todos, authenticate, async (req, res) { const { title } req.body; if (!title) return res.status(400).json({ error: Title 不能为空 }); const todo await prisma.todo.create({ data: { title, userId: req.userId, // 自动关联当前登录用户的 ID }, }); res.json({ message: 创建成功, todo }); }); // 启动服务 app.listen(3000, () { console.log( 后端服务已启动http://localhost:3000); });十、启动后端服务node index.js遇到报错了在终端中只需运行以下命令重新生成客户端即可npx prisma generate如果还是没解决那就降版本# 1. 重新安装稳定版的 prisma 包 npm install prisma/client5.22.0 npm install -D prisma5.22.0 # 2. 重新把 schema 推送到 sqlite 数据库 npx prisma db push在这个过程中还是报错所以修改了prisma/schema.prisma的内容generator client { provider prisma-client-js } datasource db { provider sqlite url file:./dev.db } model User { id Int id default(autoincrement()) email String unique password String createdAt DateTime default(now()) todos Todo[] } model Todo { id Int id default(autoincrement()) title String completed Boolean default(false) userId Int user User relation(fields: [userId], references: [id]) }重新推送数据库结构与启动服务# 1. 重新生成并同步数据库 npx prisma db push # 2. 启动后端服务 node index.js成功了