Skip to content

使用 Node.js 和 Koa 2 开发后端服务。

1. 初始化项目

首先,确保你已经安装了 Node.js 和 npm。然后按照以下步骤初始化项目:

bash
mkdir my-koa-app
cd my-koa-app
npm init -y

安装必要的依赖:

bash
npm install koa koa-router koa-bodyparser

如果你需要数据库支持,可以安装 sequelize 和对应的数据库驱动(例如 mysql2):

bash
npm install sequelize mysql2

2. 项目结构

创建以下文件和文件夹:

my-koa-app/
├── app.js
├── config/
│   └── config.js
├── controllers/
│   └── userController.js
├── models/
│   └── user.js
├── routes/
│   └── userRoutes.js
└── package.json

3. 配置文件

config/config.js

javascript
module.exports = {
  port: 3000,
  db: {
    dialect: 'mysql', // 或者 'postgres', 'sqlite' 等
    host: 'localhost',
    username: 'root',
    password: '',
    database: 'my_database',
    port: 3306,
  },
};

4. 创建模型

models/user.js

javascript
const { Sequelize, DataTypes } = require('sequelize');
const config = require('../config/config');

const sequelize = new Sequelize(config.db);

const User = sequelize.define('User', {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
  },
  age: {
    type: DataTypes.INTEGER,
  },
});

module.exports = User;

5. 创建控制器

controllers/userController.js

javascript
const User = require('../models/user');

exports.getAllUsers = async (ctx) => {
  try {
    const users = await User.findAll();
    ctx.body = users;
  } catch (error) {
    ctx.throw(500, error.message);
  }
};

exports.createUser = async (ctx) => {
  try {
    const user = await User.create(ctx.request.body);
    ctx.status = 201;
    ctx.body = user;
  } catch (error) {
    ctx.throw(500, error.message);
  }
};

exports.getUserById = async (ctx) => {
  try {
    const user = await User.findByPk(ctx.params.id);
    if (user) {
      ctx.body = user;
    } else {
      ctx.throw(404, 'User not found');
    }
  } catch (error) {
    ctx.throw(500, error.message);
  }
};

exports.updateUser = async (ctx) => {
  try {
    const user = await User.findByPk(ctx.params.id);
    if (user) {
      await user.update(ctx.request.body);
      ctx.body = user;
    } else {
      ctx.throw(404, 'User not found');
    }
  } catch (error) {
    ctx.throw(500, error.message);
  }
};

exports.deleteUser = async (ctx) => {
  try {
    const user = await User.findByPk(ctx.params.id);
    if (user) {
      await user.destroy();
      ctx.body = { message: 'User deleted successfully' };
    } else {
      ctx.throw(404, 'User not found');
    }
  } catch (error) {
    ctx.throw(500, error.message);
  }
};

6. 创建路由

routes/userRoutes.js

javascript
const Router = require('koa-router');
const userController = require('../controllers/userController');

const router = new Router({ prefix: '/api/users' });

router.get('/', userController.getAllUsers);
router.post('/', userController.createUser);
router.get('/:id', userController.getUserById);
router.put('/:id', userController.updateUser);
router.delete('/:id', userController.deleteUser);

module.exports = router;

7. 主应用文件

app.js

javascript
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const config = require('./config/config');
const userRoutes = require('./routes/userRoutes');

const app = new Koa();

// 使用 bodyParser 中间件
app.use(bodyParser());

// 注册路由
app.use(userRoutes.routes());

// 启动数据库连接
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(config.db);

sequelize
  .authenticate()
  .then(() => {
    console.log('Database connected successfully');
  })
  .catch((error) => {
    console.error('Unable to connect to the database:', error);
  });

// 同步数据库模型
sequelize.sync();

module.exports = app;

8. 创建服务器文件

server.js

javascript
const app = require('./app');

const port = config.port || 3000;

app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

9. 启动项目

运行以下命令启动服务器:

bash
node server.js

10. 测试接口

你可以使用工具如 Postmancurl 测试接口。

示例请求:

  • 获取所有用户

    bash
    GET http://localhost:3000/api/users
  • 创建新用户

    bash
    POST http://localhost:3000/api/users
    Content-Type: application/json
    
    {
      "name": "John Doe",
      "email": "john.doe@example.com",
      "age": 30
    }
  • 获取单个用户

    bash
    GET http://localhost:3000/api/users/1
  • 更新用户

    bash
    PUT http://localhost:3000/api/users/1
    Content-Type: application/json
    
    {
      "name": "John Doe Updated",
      "email": "john.doe.updated@example.com"
    }
  • 删除用户

    bash
    DELETE http://localhost:3000/api/users/1

11. 其他功能扩展

你可以根据需求扩展以下功能:

  • 添加身份验证和授权(如 JWT)
  • 添加分页功能
  • 添加错误日志记录
  • 添加单元测试