使用 Koa2 和 MySQL 构建 Node.js 应用

近年来,Node.js 的流行使得构建高效 Web 应用变得更加简单。Koa2 是一个优秀的 Node.js Web 框架,它的异步风格使得处理请求非常高效。而 MySQL 则是常用的关系型数据库之一,它提供了强大的数据存储和查询能力。本文将介绍如何使用 Koa2 和 MySQL 构建 Node.js 应用。

安装和初始化项目

我们首先需要安装 Node.js 和 MySQL。

然后新建一个项目目录,使用 npm 初始化项目:

接着安装 Koa2 和 MySQL:

koa 是 Koa2 的核心模块,koa-router 提供了路由功能,koa-bodyparser 用于解析请求体,mysql2 是 MySQL 的 Node.js 数据库驱动,sequelize 是用于数据库 ORM 操作的工具。

创建数据库

我们假设我们要创建一个 todo 项管理系统,那么我们需要在 MySQL 中创建一个 database 和一个 todo 表。可以使用如下 SQL 语句在 MySQL 中创建:

CREATE DATABASE todo_db;
USE todo_db;
CREATE TABLE IF NOT EXISTS todo (
    id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

连接数据库

我们需要配置一个数据库连接池,并使用 sequelize 进行 ORM 操作。在项目根目录下,新建一个 models/index.js 文件:

const Sequelize = require('sequelize');

const sequelize = new Sequelize('todo_db', 'root', '', {
  host: 'localhost',
  dialect: 'mysql'
});

const db = {};

db.Sequelize = Sequelize;
db.sequelize = sequelize;

db.Todo = require('./todo.model.js')(sequelize, Sequelize);

module.exports = db;

在上述代码中,我们先创建了一个 Sequelize 实例,并指定了要连接的数据库和连接参数。然后定义了一个 db 对象,导出到外部使用。我们还需要在同一目录下创建一个 todo.model.js 文件:

module.exports = (sequelize, Sequelize) => {
  const Todo = sequelize.define('todo', {
    name: {
      type: Sequelize.STRING
    }
  });

  return Todo;
};

在上述代码中,我们使用 sequelize.define 创建了一个名为 todo 的表,其中包含一个名为 name 的字段。通过 module.exports 导出模型,让它可以在其他文件中被引用。

编写路由

我们使用 koa-router 模块来处理路由。在项目根目录下创建一个 routes/todo.route.js 文件:

const router = require('koa-router')();
const { create, findAll, findOne, update, delete: destroy } = require('../controllers/todo.controller.js');

router.post('/todos', create);
router.get('/todos', findAll);
router.get('/todos/:id', findOne);
router.put('/todos/:id', update);
router.delete('/todos/:id', destroy);

module.exports = router;

在上述代码中,我们创建了 5 个路由规则,分别是创建、获取全部、获取单个、更新和删除 todo 项。路由规则会调用相应的控制器函数进行处理,因此我们还需要编写相应的控制器函数。在项目根目录下创建一个 controllers/todo.controller.js 文件:

const db = require('../models');
const Todo = db.Todo;

exports.create = async (ctx) => {
  const body = ctx.request.body;

  if (!body.name) {
    ctx.throw(400, 'name required');
  }

  const result = await Todo.create({
    name: body.name
  });

  ctx.body = result;
};

exports.findAll = async (ctx) => {
  const results = await Todo.findAll();

  ctx.body = results;
};

exports.findOne = async (ctx) => {
  const id = ctx.params.id;

  const todo = await Todo.findOne({
    where: { id: id }
  });

  if (!todo) {
    ctx.throw(404, 'todo not found');
  }

  ctx.body = todo;
};

exports.update = async (ctx) => {
  const id = ctx.params.id;
  const body = ctx.request.body;

  const todo = await Todo.findOne({
    where: { id: id }
  });

  if (!todo) {
    ctx.throw(404, 'todo not found');
  }

  const result = await todo.update({
    name: body.name
  });

  ctx.body = result;
};

exports.delete = async (ctx) => {
  const id = ctx.params.id;

  await Todo.destroy({
    where: { id: id }
  });

  ctx.body = { message: 'success' };
};

在上述代码中,我们将控制器函数导出到外部,其中包括了创建、获取全部、获取单个、更新和删除 todo 项的功能。我们在每个函数中编写了相应的 sequelize ORM 操作。注意,在 delete 函数中,我们使用了 JavaScript 中的关键字作为变量名,需要使用 delete: 的形式进行声明,并在调用时使用 destroy 来代替 delete

编写应用程序

在项目根目录下新建一个 app.js 文件,编写应用程序代码:

const Koa = require('koa');
const bodyParser = require('koa-bodyparser');

const db = require('./models');
const todoRoute = require('./routes/todo.route.js');

const app = new Koa();

db.sequelize.sync()
  .then(() => {
    console.log('database connected');
  });

app.use(bodyParser());
app.use(todoRoute.routes());

app.listen(3000, () => {
  console.log('server started');
});

在上述代码中,我们创建了一个 Koa 应用程序实例,并导入了 todo.route.js 文件定义的路由规则。我们还调用了 bodyParser 中间件,以便在控制器函数中解析请求体。通过调用 db.sequelize.sync(),我们在应用程序启动时自动创建数据库表。

测试应用程序

在命令行中运行 node app.js 启动应用程序,然后使用 curl 或 Postman 等工具测试 API 接口。例如,使用 curl 命令向服务器发送 POST 请求:

如果一切正常,应该返回创建的 todo 对象:

{
  "id": 1,
  "name": "task1",
  "createdAt": "2022-10-24T03:09:59.000Z",
  "updatedAt": "2022-10-24T03:09:59.000Z"
}

其他请求也可以使用类似的方式进行测试。

总结

本文介绍了如何使用 Koa2 和 MySQL 构建 Node.js 应用程序,包括连接数据库、编写路由和控制器函数、以及测试应用程序。使用这些工具可以提高开发效率,使得构建高效 Web 应用变得更加简单。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65963b97eb4cecbf2da183d3


纠错反馈