Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它让开发者能够在服务器端运行 JavaScript 代码。以下是关于 Node.js 更详细的介绍:
核心特点:
-
异步非阻塞 I/O 模型
- 单线程事件循环架构
- 适合 I/O 密集型应用
- 通过回调函数处理异步操作
-
跨平台支持
- 支持 Windows、macOS 和 Linux
- 提供统一的 API 接口
-
模块化系统
- ***monJS 模块规范
- npm (Node Package Manager) 生态系统
- 内置核心模块(fs、http、path等)
技术架构:
- 底层使用 C++ 编写
- 上层 JavaScript API
- 事件驱动架构
- 流(Stream)处理能力
应用场景:
-
Web 应用开发
- RESTful API 服务
- 实时应用(聊天室、协作工具)
- 微服务架构
-
工具开发
- 构建工具(Webpack、Gulp)
- 命令行工具
- 自动化脚本
-
中间层服务
- BFF (Backend For Frontend)
- 服务聚合层
-
物联网(IoT)
- 设备控制
- 数据采集
性能特点:
- 高并发处理能力
- 内存占用相对较低
- 启动速度快
生态系统:
- 最大的开源包仓库(npm)
- 丰富的框架选择(Express、Koa、NestJS等)
- 活跃的开发者社区
学习曲线:
- 需要理解异步编程
- 熟悉回调、Promise、async/await
- 掌握事件循环机制
版本管理:
- LTS (长期支持版本)
- 当前版本
- 使用 nvm 等工具管理多版本
开发工具:
- 调试工具(Chrome DevTools)
- 测试框架(Jest、Mocha)
- 日志系统
典型项目结构:
project/
├── node_modules/ # 依赖包
├── src/ # 源代码
│ ├── controllers/
│ ├── models/
│ └── routes/
├── tests/ # 测试代码
├── package.json # 项目配置
└── README.md # 项目说明
发展趋势:
- 越来越广泛的企业应用
- 与前端开发深度整合
- Serverless 支持
- 性能持续优化
环境准备
在开始之前,请确保你已经安装了以下开发工具和环境:
-
Node.js 运行环境
- 建议安装最新的 LTS (长期支持) 版本,如 16.x 或 18.x
- 下载地址:https://nodejs.org/ (提供Windows/macOS/Linux安装包)
- 安装完成后,请打开终端或命令行工具验证安装:
node -v # 查看Node.js版本 npm -v # 查看npm版本 - 如果在中国大陆地区,建议配置淘宝镜像源:
npm config set registry https://registry.npm.taobao.org
-
npm 包管理工具
- npm (Node Package Manager) 会随 Node.js 自动安装
- 建议更新到最新稳定版本:
npm install -g npm@latest - 常用命令说明:
npm init # 初始化项目 npm install # 安装依赖 npm update # 更新依赖
-
代码编辑器 (推荐选择)
-
VS Code (免费)
- 下载地址:https://code.visualstudio.***/
- 推荐插件:
- ESLint - 代码规范检查
- Prettier - 代码格式化
- Debugger for Chrome - 调试工具
-
Sublime Text (付费)
- 轻量快速,启动时间短
- 可通过Package Control安装插件扩展功能
-
WebStorm (付费)
- JetBrains专业的JavaScript IDE
- 提供智能代码补全、重构工具等高级功能
- 学生可申请免费授权
-
VS Code (免费)
-
可选工具
- Git版本控制工具
- Postman API测试工具
- Chrome开发者工具
安装过程中如果遇到问题,可以:
- 检查系统环境变量配置
- 确保安装路径不含中文和特殊字符
- 以管理员权限运行安装程序
项目初始化
1. 创建项目文件夹
mkdir my-express-api
cd my-express-api
2. 初始化 npm 项目
npm init -y
这会生成一个默认的 package.json 文件,包含项目基本信息。
3. 安装 Express 框架
npm install express
安装完成后,Express 会被添加到 package.json 的 dependencies 中。
基础 API 搭建
1. 创建主文件
新建 app.js 文件,添加以下代码:
// 引入 Express 框架
const express = require('express')
// 创建 Express 应用实例
const app = express()
// 设置服务器端口号
const port = 3000
// 中间件:解析 JSON 格式的请求体
app.use(express.json())
// 简单路由示例 - 根路径
app.get('/', (req, res) => {
res.send('欢迎使用 Express API 服务')
})
// 启动服务器
app.listen(port, () => {
console.log(`服务器已启动,访问地址:http://localhost:${port}`)
console.log(`尝试访问 http://localhost:${port}/users 查看用户数据`)
})
2. 添加 CRUD 路由
扩展 app.js 文件,添加基本的 CRUD 操作:
// 模拟数据库 - 使用内存数组存储用户数据
let users = [
{ id: 1, name: '张三', email: 'zhangsan@example.***' },
{ id: 2, name: '李四', email: 'lisi@example.***' }
]
// 获取所有用户 - GET /users
app.get('/users', (req, res) => {
// 返回 JSON 格式的用户列表
res.json({
su***ess: true,
data: users,
message: '成功获取用户列表'
})
})
// 获取单个用户 - GET /users/:id
app.get('/users/:id', (req, res) => {
// 查找匹配 ID 的用户
const user = users.find(u => u.id === parseInt(req.params.id))
// 如果用户不存在,返回 404 状态码
if (!user) return res.status(404).json({
su***ess: false,
message: '用户未找到'
})
// 返回找到的用户
res.json({
su***ess: true,
data: user
})
})
// 创建用户 - POST /users
app.post('/users', (req, res) => {
// 验证请求体
if (!req.body.name) {
return res.status(400).json({
su***ess: false,
message: '用户名不能为空'
})
}
// 创建新用户对象
const user = {
id: users.length > 0 ? Math.max(...users.map(u => u.id)) + 1 : 1,
name: req.body.name,
email: req.body.email || ''
}
// 添加到用户数组
users.push(user)
// 返回 201 创建成功状态码
res.status(201).json({
su***ess: true,
data: user,
message: '用户创建成功'
})
})
// 更新用户 - PUT /users/:id
app.put('/users/:id', (req, res) => {
// 查找用户
const user = users.find(u => u.id === parseInt(req.params.id))
// 如果用户不存在,返回 404
if (!user) return res.status(404).json({
su***ess: false,
message: '用户未找到'
})
// 更新用户信息
user.name = req.body.name || user.name
user.email = req.body.email || user.email
// 返回更新后的用户
res.json({
su***ess: true,
data: user,
message: '用户更新成功'
})
})
// 删除用户 - DELETE /users/:id
app.delete('/users/:id', (req, res) => {
// 查找用户索引
const userIndex = users.findIndex(u => u.id === parseInt(req.params.id))
// 如果用户不存在,返回 404
if (userIndex === -1) return res.status(404).json({
su***ess: false,
message: '用户未找到'
})
// 删除用户
const deletedUser = users.splice(userIndex, 1)
// 返回被删除的用户
res.json({
su***ess: true,
data: deletedUser[0],
message: '用户删除成功'
})
})
测试 API
1. 启动服务器
node app.js
2. 使用测试工具
使用 Postman 测试
- 导入 Postman 集合
- 创建环境变量
baseUrl设置为http://localhost:3000 - 测试各个端点
使用 curl 命令测试
获取所有用户:
curl -X GET http://localhost:3000/users
创建新用户:
curl -X POST -H "Content-Type: application/json" -d '{"name":"王五","email":"wangwu@example.***"}' http://localhost:3000/users
更新用户:
curl -X PUT -H "Content-Type: application/json" -d '{"name":"赵六","email":"zhaoliu@example.***"}' http://localhost:3000/users/1
删除用户:
curl -X DELETE http://localhost:3000/users/2
进阶配置
1. 添加错误处理中间件
在 app.js 中添加:
// 错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).json({
su***ess: false,
message: '服务器内部错误',
error: process.env.NODE_ENV === 'development' ? err.message : undefined
})
})
2. 使用路由模块
创建模块化路由结构:
创建 routes/users.js
const express = require('express')
const router = express.Router()
let users = [...] // 同上
// 获取所有用户
router.get('/', (req, res) => {
res.json(users)
})
// 获取单个用户
router.get('/:id', (req, res) => {
// ...实现同上
})
// 创建用户
router.post('/', (req, res) => {
// ...实现同上
})
// 更新用户
router.put('/:id', (req, res) => {
// ...实现同上
})
// 删除用户
router.delete('/:id', (req, res) => {
// ...实现同上
})
module.exports = router
修改 app.js
const usersRouter = require('./routes/users')
// 使用用户路由
app.use('/users', usersRouter)
3. 添加环境变量
安装 dotenv 包:
npm install dotenv
创建 .env 文件:
PORT=3000
DB_URL=mongodb://localhost:27017/mydb
NODE_ENV=development
在 app.js 顶部添加:
require('dotenv').config()
const port = process.env.PORT || 3000
项目结构建议
my-express-api/
├── node_modules/ # 项目依赖
├── routes/ # 路由文件
│ ├── users.js # 用户相关路由
│ └── products.js # 产品相关路由
├── controllers/ # 控制器
│ ├── userController.js # 用户业务逻辑
│ └── productController.js
├── models/ # 数据模型
│ ├── userModel.js # 用户数据模型
│ └── productModel.js
├── middlewares/ # 自定义中间件
│ ├── auth.js # 认证中间件
│ └── errorHandler.js # 错误处理中间件
├── utils/ # 工具函数
│ ├── validators.js # 数据验证
│ └── logger.js # 日志工具
├── config/ # 配置文件
│ ├── db.js # 数据库配置
│ └── constants.js # 常量配置
├── tests/ # 测试文件
├── .env # 环境变量
├── .gitignore # Git忽略文件
├── app.js # 应用入口文件
├── package.json # 项目配置
└── README.md # 项目说明文档
部署准备
1. 安装 nodemon 用于开发热重载
npm install --save-dev nodemon
2. 修改 package.json 的 scripts
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js",
"test": "jest"
}
3. 启动开发服务器
npm run dev
4. 生产环境启动
npm start
后续改进建议
1. 连接真实数据库
-
MongoDB (使用 Mongoose)
- 安装 Mongoose 并建立连接
- 定义 Schema 和 Model
- 示例:用户数据模型
const userSchema = new mongoose.Schema({ username: String, email: String, password: String }); const User = mongoose.model('User', userSchema);
-
MySQL/PostgreSQL (使用 Sequelize 或 TypeORM)
- 安装 Sequelize 及相关数据库驱动
- 配置数据库连接
- 定义模型和关联关系
- 示例:使用 Sequelize 定义产品模型
const Product = sequelize.define('Product', { name: DataTypes.STRING, price: DataTypes.FLOAT, stock: DataTypes.INTEGER });
2. 添加身份验证
-
JWT (JSON Web Token)
- 安装 jsonwebtoken 包
- 实现登录接口生成 token
- 创建中间件验证 token
- 示例:生成 JWT
const token = jwt.sign({ userId: user.id }, 'secret-key', { expiresIn: '1h' });
-
OAuth 2.0
- 集成 Google/Facebook/GitHub 等第三方登录
- 实现回调处理
- 示例:Passport.js 的 Google 策略配置
passport.use(new GoogleStrategy({ clientID: GOOGLE_CLIENT_ID, clientSecret: GOOGLE_CLIENT_SECRET, callbackURL: "/auth/google/callback" }, callbackFunction));
3. API 文档
-
使用 Swagger 自动生成 API 文档
- 安装 swagger-jsdoc 和 swagger-ui-express
- 添加 JSDoc 注释
- 配置 Swagger UI 路由
- 示例:定义用户 API 文档
/** * @swagger * /users: * get: * summary: 获取用户列表 * responses: * 200: * description: 成功返回用户列表 */
4. 测试
-
单元测试 (Jest/Mocha)
- 编写测试用例覆盖核心业务逻辑
- 使用 mock 隔离外部依赖
- 示例:测试用户服务
test('should create new user', async () => { const user = await userService.create({username: 'test'}); expect(user.username).toBe('test'); });
-
集成测试 (Supertest)
- 测试 API 端点
- 验证请求/响应
- 示例:测试用户 API
request(app) .get('/api/users') .expect(200) .then(response => { ... });
5. 日志记录
-
Winston 或 Morgan
- 配置日志级别和输出格式
- 记录请求信息、错误等
- 示例:Winston 基本配置
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [new winston.transports.File({ filename: '***bined.log' })] });
6. 性能优化
-
添加缓存 (Redis)
- 安装 Redis 客户端
- 缓存高频访问数据
- 实现缓存失效策略
- 示例:缓存产品数据
const cachedProducts = await redisClient.get('products'); if (cachedProducts) return JSON.parse(cachedProducts);
-
实现请求限流
- 使用 express-rate-limit
- 配置限流规则
- 示例:API 限流
const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟 max: 100 // 每个IP限制100次请求 }); app.use('/api/', limiter);
现在你已经完成了一个基本的 Express API 服务搭建!这个 API 具备了基本的 CRUD 功能,并采用了模块化结构,便于后续扩展和维护。