Node.js已经成为后端开发的主流选择之一,尤其在全栈JavaScript开发、高并发API服务、实时应用等场景表现出色。2026年的Node.js生态已经非常成熟,从框架选择到数据库操作,从认证授权到部署运维,都有完善的解决方案。本文将分享Node.js后端开发的技术选型和最佳实践。
一、Node.js框架选型
| 框架 | 特点 | 适用场景 | 性能 |
|---|---|---|---|
| NestJS | 企业级、模块化、TypeScript原生 | 大型企业应用 | 良好 |
| Express | 极简、灵活、生态丰富 | 中小型API、快速原型 | 良好 |
| Fastify | 高性能、类型安全、插件化 | 高并发API服务 | 极佳 |
| Hono | 超轻量、多运行时支持 | Serverless、边缘计算 | 极佳 |
| AdonisJS | 全栈框架、ORM集成 | 全栈应用、快速开发 | 良好 |
对于大型项目推荐NestJS,它提供了依赖注入、模块化架构、守卫、拦截器等企业级特性。对于追求性能的API服务,Fastify是最佳选择,吞吐量比Express高2-3倍。
二、Fastify高性能API开发
import Fastify from 'fastify'
import { Type, TypeBoxTypeProvider } from '@fastify/type-provider-typebox'
const fastify = Fastify({
logger: true,
}).withTypeProvider()
// 类型安全的路由
fastify.post('/users', {
schema: {
body: Type.Object({
name: Type.String(),
email: Type.String({ format: 'email' }),
}),
response: {
201: Type.Object({
id: Type.Number(),
name: Type.String(),
}),
},
},
}, async (request, reply) => {
const { name, email } = request.body
const user = await db.user.create({ name, email })
return reply.code(201).send(user)
})
fastify.listen({ port: 3000, host: '0.0.0.0' })
三、数据库操作与ORM
推荐使用Prisma作为ORM,它提供类型安全的数据库访问、自动迁移、可视化数据管理:
// schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
// 查询示例
const usersWithPosts = await prisma.user.findMany({
include: { posts: true },
where: { posts: { some: { published: true } } },
orderBy: { createdAt: 'desc' },
take: 10,
})
四、认证与授权
JWT + Refresh Token是目前最常用的认证方案:
import jwt from 'jsonwebtoken'
// 生成AccessToken
const accessToken = jwt.sign(
{ userId: user.id, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '15m' }
)
// 生成RefreshToken
const refreshToken = jwt.sign(
{ userId: user.id, tokenVersion: user.tokenVersion },
process.env.REFRESH_SECRET,
{ expiresIn: '7d' }
)
// 验证中间件
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1]
if (!token) return res.status(401).send('未授权')
try {
const payload = jwt.verify(token, process.env.JWT_SECRET)
req.user = payload
next()
} catch {
return res.status(401).send('Token无效')
}
}
五、API设计最佳实践
- 使用RESTful规范或GraphQL,保持接口一致性
- 版本化API:/api/v1/users
- 统一响应格式:{ code, message, data }
- 分页使用游标或偏移量,返回总数
- 限流防刷:基于IP或用户ID的速率限制
- 参数校验:使用Zod或Joi进行输入验证
- 错误处理:全局错误捕获,统一错误码
// 统一响应格式
{
"code": 0,
"message": "success",
"data": { ... },
"timestamp": 1704067200000
}
// 分页响应
{
"code": 0,
"data": {
"list": [...],
"total": 100,
"page": 1,
"pageSize": 20
}
}
六、性能优化与部署
| 优化项 | 方法 | 效果 |
|---|---|---|
| 集群模式 | PM2 cluster模式,利用多核CPU | 吞吐量提升N倍 |
| Redis缓存 | 热点数据缓存、会话存储 | 响应时间减少80% |
| 数据库连接池 | Prisma/PgBouncer连接池 | 减少连接开销 |
| 压缩 | 启用gzip/Brotli压缩 | 传输体积减少60% |
| 日志 | pino高性能日志 | 日志开销最小化 |
PM2部署配置:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'api-server',
script: './dist/main.js',
instances: 'max',
exec_mode: 'cluster',
env: { NODE_ENV: 'production' },
max_memory_restart: '500M',
}]
}
// 部署
pm2 start ecosystem.config.js
pm2 save
pm2 startup