基于 Node.js、Fastify、Prisma、Zod 的服务项目
基于 Node.js、Fastify、Prisma、Zod 的服务项目
首先,你需要确保已经安装了以下软件:
- Node.js(建议版本:14+)
- npm
- Docker
接下来,打开终端并执行以下命令:
- 创建一个新的项目目录并进入:
mkdir my-project
cd my-project
- 初始化 npm 项目:
npm init -y
- 安装必要的依赖:
npm install prisma zod fastify fastify-cors dotenv --save
npm install typescript ts-node-dev @types/node @types/uuid --save-dev
这里的依赖包括:
prisma
:Prisma ORM 库zod
:用于验证输入输出的库fastify
:Web 服务器框架fastify-cors
:Fastify 跨域插件dotenv
:环境变量加载器
以及一些开发依赖:
typescript
:TypeScript 编译器ts-node-dev
:用于开发环境的 TypeScript 实时编译工具@types/node
:Node.js 类型声明文件@types/uuid
:UUID 类型声明文件
- 创建
.env
文件并添加以下内容:
DATABASE_URL="postgresql://myuser:mypassword@localhost:5432/mydatabase"
PORT=3000
其中,DATABASE_URL
是连接到你的 PostgreSQL 数据库的 URL(注意替换为你的用户名、密码和数据库名),PORT
是服务运行的端口号。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id String @id @default(uuid())
name String
email String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
这是 Prisma 数据模型,它描述了我们将存储在数据库中的数据。这里定义了一个名为 User 的数据模型,包含 id、name、email、createdAt 和 updatedAt 字段。
- 创建
src/index.ts
文件并添加以下内容:
import fastify from 'fastify';
import fastifyCors from 'fastify-cors';
import { PrismaClient } from '@prisma/client';
import { z } from 'zod';
const prisma = new PrismaClient();
const server = fastify();
server.register(fastifyCors);
const userSchema = z.object({
name: z.string(),
email: z.string().email(),
});
server.post<{ Body: { name: string; email: string } }>(
'/users',
async (request, reply) => {
try {
const newUser = userSchema.parse(request.body);
const user = await prisma.user.create({
data: {
name: newUser.name,
email: newUser.email,
},
});
reply.send(user);
} catch (error) {
console.log(error);
reply.status(400).send({ message: error.message });
}
}
);
server.listen(process.env.PORT, (err, address) => {
if (err) {
console.error(err);
process.exit(1);
}
console.log(`Server started on ${address}`);
});
这是我们的服务代码。它使用 fastify
创建了一个 HTTP 服务器,并定义了一个 POST /users
路由,用于创建新用户。此路由接受具有 name 和 email 字段的 JSON 请求体,并将其验证为符合 userSchema
对象(使用 Zod 库)的格式。如果请求有效,则会将新用户添加到数据库中并返回响应。
- 添加 TypeScript 配置文件
tsconfig.json
:
{
"compilerOptions": {
"target": "ES2020",
"module": "CommonJS",
"esModuleInterop": true,
"strict": true,
"outDir": "dist",
"sourceMap": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
这个配置文件告诉 TypeScript 编译器如何编译我们的代码,并忽略 node_modules
文件夹。
- 在
package.json
中添加以下脚本:
{
"scripts": {
"dev": "ts-node-dev --no-notify --transpile-only src/index.ts",
"build": "rm -rf dist && tsc",
"start": "npm run build && node dist/index.js"
}
}
这里的脚本包括:
dev
:使用ts-node-dev
工具在开发模式下运行服务,可以实现热更新build
:使用 TypeScript 编译器编译我们的代码到dist
目录start
:构建和启动服务
- 启动服务:
npm run dev
现在你的服务应该已经运行在 http://localhost:3000,可以使用 Postman 或其他 HTTP 客户端测试 API。
漫思
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2022-01-25 《Node.js 开发者 2021 报告》发布
2022-01-25 可能使用redux的地方
2022-01-25 tab页的数据结构设计
2022-01-25 富文本编辑器的实例
2022-01-25 antdmobile 2.0的bug
2022-01-25 Griffith - 知乎视频播放器
2022-01-25 Draft.js 在知乎的实践