Node.js入门:如何用Express搭建一个简单API

Node.js入门:如何用Express搭建一个简单API

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它让开发者能够在服务器端运行 JavaScript 代码。以下是关于 Node.js 更详细的介绍:

核心特点:

  1. 异步非阻塞 I/O 模型

    • 单线程事件循环架构
    • 适合 I/O 密集型应用
    • 通过回调函数处理异步操作
  2. 跨平台支持

    • 支持 Windows、macOS 和 Linux
    • 提供统一的 API 接口
  3. 模块化系统

    • ***monJS 模块规范
    • npm (Node Package Manager) 生态系统
    • 内置核心模块(fs、http、path等)

技术架构:

  • 底层使用 C++ 编写
  • 上层 JavaScript API
  • 事件驱动架构
  • 流(Stream)处理能力

应用场景:

  1. Web 应用开发

    • RESTful API 服务
    • 实时应用(聊天室、协作工具)
    • 微服务架构
  2. 工具开发

    • 构建工具(Webpack、Gulp)
    • 命令行工具
    • 自动化脚本
  3. 中间层服务

    • BFF (Backend For Frontend)
    • 服务聚合层
  4. 物联网(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 支持
  • 性能持续优化

 

环境准备

在开始之前,请确保你已经安装了以下开发工具和环境:

  1. 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
      

  2. npm 包管理工具

    • npm (Node Package Manager) 会随 Node.js 自动安装
    • 建议更新到最新稳定版本:
      npm install -g npm@latest
      

    • 常用命令说明:
      npm init     # 初始化项目
      npm install  # 安装依赖
      npm update   # 更新依赖
      

  3. 代码编辑器 (推荐选择)

    • VS Code (免费)
      • 下载地址:https://code.visualstudio.***/
      • 推荐插件:
        • ESLint - 代码规范检查
        • Prettier - 代码格式化
        • Debugger for Chrome - 调试工具
    • Sublime Text (付费)
      • 轻量快速,启动时间短
      • 可通过Package Control安装插件扩展功能
    • WebStorm (付费)
      • JetBrains专业的JavaScript IDE
      • 提供智能代码补全、重构工具等高级功能
      • 学生可申请免费授权
  4. 可选工具

    • 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 测试
  1. 导入 Postman 集合
  2. 创建环境变量 baseUrl 设置为 http://localhost:3000
  3. 测试各个端点
使用 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 功能,并采用了模块化结构,便于后续扩展和维护。

转载请说明出处内容投诉
CSS教程网 » Node.js入门:如何用Express搭建一个简单API

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买