2022-03-09 23:24:43
在Node.js应用中跨文件共享PrismaClient实例的最佳实践是通过独立的模块封装PrismaClient实例,利用Node.js模块缓存机制实现单例模式,避免循环依赖并提升代码可维护性。以下是具体实现方案和核心要点:
一、核心实现步骤创建独立模块文件在项目目录(如src/utils/)下新建prismaClient.ts,负责实例化并导出PrismaClient:
// src/utils/prismaClient.tsimport { PrismaClient } from '@prisma/client';const prisma = new PrismaClient(); // 单例实例化export default prisma;单例保障:Node.js模块缓存机制确保多次导入时仅执行一次new PrismaClient()。
主入口文件调整主文件(如src/index.ts)无需导出PrismaClient实例,仅在需要时直接导入:
// src/index.tsimport express from 'express';import userRoutes from './routes/users';// 仅在需要时导入(非必须)// import prisma from './utils/prismaClient';const app = express();app.use('/api/users', userRoutes);app.listen(3500, () => console.log('Server running'));控制器文件直接导入控制器(如src/controllers/users.ts)从独立模块导入PrismaClient:
// src/controllers/users.tsimport { RequestHandler } from 'express';import prisma from '../utils/prismaClient'; // 直接导入单例export const createUser: RequestHandler = async (req, res) => { const user = await prisma.user.create({ data: req.body }); res.status(201).json(user);};路由文件保持简洁路由文件(如src/routes/users.ts)仅映射路径,不涉及PrismaClient:
// src/routes/users.tsimport { Router } from 'express';import { createUser } from '../controllers/users';const router = Router();router.post('/', createUser);export default router;消除循环依赖通过解耦PrismaClient实例化逻辑,避免主入口文件、路由、控制器之间的循环引用(如index.ts → routes → controllers → index.ts)。
单例模式保障Node.js模块缓存机制确保全局仅一个PrismaClient实例,符合官方推荐,避免连接池重复创建的开销。
代码解耦与可维护性数据库操作集中管理,修改配置(如日志、连接池)时无需遍历多个文件。
测试便利性单元测试中可轻松模拟或替换prismaClient.ts模块,例如使用jest.mock。
错误处理所有数据库操作需包裹try-catch,避免未捕获的异常导致进程崩溃:
try { await prisma.user.findUnique({ where: { id: 1 } });} catch (error) { console.error('Database error:', error); throw error; // 或返回友好错误响应}优雅关闭连接在应用退出时(如process.on('SIGTERM'))调用prisma.$disconnect()释放资源:
process.on('SIGTERM', async () => { await prisma.$disconnect(); process.exit(0);});TypeScript类型支持利用Prisma生成的TypeScript类型增强代码安全性,例如:
interface User { id: number; name: string;}const user: User = await prisma.user.findUnique(...); // 类型自动推断通过独立模块封装PrismaClient实例,开发者可实现:
此模式是Node.js应用中管理数据库客户端的推荐实践,尤其适用于Express、Fastify等框架与Prisma ORM的集成场景。