近年来,Node.js 的流行使得构建高效 Web 应用变得更加简单。Koa2 是一个优秀的 Node.js Web 框架,它的异步风格使得处理请求非常高效。而 MySQL 则是常用的关系型数据库之一,它提供了强大的数据存储和查询能力。本文将介绍如何使用 Koa2 和 MySQL 构建 Node.js 应用。
安装和初始化项目
我们首先需要安装 Node.js 和 MySQL。
然后新建一个项目目录,使用 npm 初始化项目:
npm init
接着安装 Koa2 和 MySQL:
npm install koa koa-router koa-bodyparser mysql2 sequelize
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 请求:
curl -X POST http://localhost:3000/todos -H 'Content-type: application/json' -d '{"name":"task1"}'
如果一切正常,应该返回创建的 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