下面是一个详细的示例,展示了如何使用 Sequelize 和 Express 实现模块化开发,并包含增删改查、可选的条件查询和分页功能。我们将使用 .env 文件来管理环境变量,并使用控制器来组织代码。

目录结构

project-root/
├── app.js
├── controllers/
│   └── userController.js
├── models/
│   └── user.js
├── routes/
│   └── users.js
├── .env
└── package.json

1. 安装必要的依赖

确保你已经安装了以下依赖:

npm install express sequelize mysql2 body-parser dotenv

2. 创建 .env 文件

在项目的根目录下创建一个 .env 文件,并添加你的环境变量。例如:

DB_NAME=your_database_name
DB_USER=your_username
DB_PASSWORD=your_password
DB_HOST=localhost
DB_DIALECT=mysql
PORT=3000

3. 创建 Sequelize 模型

在 models/user.js 文件中定义用户模型:

// models/user.js
require('dotenv').config();
const { Sequelize, DataTypes } = require('sequelize');

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
  host: process.env.DB_HOST,
  dialect: process.env.DB_DIALECT
});

const User = sequelize.define('User', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true
  }
}, {
  timestamps: false // 不生成 createdAt 和 updatedAt 字段
});

module.exports = User;

4. 创建控制器

在 controllers/userController.js 文件中定义用户相关的控制器函数:

// controllers/userController.js
const User = require('../models/user');

// 创建用户
exports.createUser = async (req, res) => {
  try {
    const { name, email } = req.body;
    const user = await User.create({ name, email });
    res.status(201).json(user);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

// 获取所有用户(支持分页和条件查询)
exports.getUsers = async (req, res) => {
  try {
    const { page = 1, limit = 10, name } = req.query;

    // 构建查询条件
    const whereClause = {};
    if (name) {
      whereClause.name = { [Sequelize.Op.like]: `%${name}%` };
    }

    // 计算偏移量
    const offset = (page - 1) * limit;

    // 执行查询
    const users = await User.findAll({
      where: whereClause,
      limit: parseInt(limit),
      offset: offset
    });

    // 获取总数以计算总页数
    const total = await User.count({ where: whereClause });
    const totalPages = Math.ceil(total / limit);

    res.json({
      users,
      page: parseInt(page),
      totalPages,
      total
    });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

// 获取单个用户
exports.getUser = async (req, res) => {
  try {
    const user = await User.findByPk(req.params.id);
    if (user) {
      res.json(user);
    } else {
      res.status(404).json({ error: 'User not found' });
    }
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

// 更新用户
exports.updateUser = async (req, res) => {
  try {
    const user = await User.findByPk(req.params.id);
    if (user) {
      user.name = req.body.name || user.name;
      user.email = req.body.email || user.email;
      await user.save();
      res.json(user);
    } else {
      res.status(404).json({ error: 'User not found' });
    }
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

// 删除用户
exports.deleteUser = async (req, res) => {
  try {
    const user = await User.findByPk(req.params.id);
    if (user) {
      await user.destroy();
      res.status(204).send();
    } else {
      res.status(404).json({ error: 'User not found' });
    }
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
};

5. 创建路由

在 routes/users.js 文件中定义用户相关的路由,并使用控制器函数:

// routes/users.js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');

// 创建用户
router.post('/', userController.createUser);

// 获取所有用户(支持分页和条件查询)
router.get('/', userController.getUsers);

// 获取单个用户
router.get('/:id', userController.getUser);

// 更新用户
router.put('/:id', userController.updateUser);

// 删除用户
router.delete('/:id', userController.deleteUser);

module.exports = router;

6. 创建 Express 应用

在 app.js 文件中设置 Express 应用并引入路由:

// app.js
require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const usersRouter = require('./routes/users');

const app = express();
app.use(bodyParser.json());

// 使用用户路由
app.use('/users', usersRouter);

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

7. 运行应用

现在你可以运行你的应用,它将从 .env 文件中加载环境变量,并提供增删改查、条件查询和分页功能。

node app.js

测试 API

你可以使用 Postman 或 curl 来测试你的 API,以下是一些示例请求:

创建用户
curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"name": "John Doe", "email": "john@example.com"}'
获取第一页的全部用户列表(每页 10 条记录)
curl http://localhost:3000/users?page=1&limit=10
根据姓名查询用户列表(例如,查找名字包含 “John” 的用户)
curl http://localhost:3000/users?page=1&limit=10&name=John
获取单个用户
curl http://localhost:3000/users/1
更新用户
curl -X PUT http://localhost:3000/users/1 -H "Content-Type: application/json" -d '{"name": "Jane Doe", "email": "jane@example.com"}'
删除用户
curl -X DELETE http://localhost:3000/users/1

通过这种方式,你可以实现模块化开发,并且包含增删改查、条件查询和分页功能。代码中包含了详细的注释,方便理解和维护。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐