Koa是基于 Node.js 平台的下一代 web 开发框架,由express原班人马打造,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。
此文是简单介绍使用kos2进行项目的基本搭建以及api的简单开发
搭建环境
1.因为此框架是基于node.js的,安装node是必须的进行的第一步,这里不再详细介绍
2.安装koa(我们使用淘宝镜像进行安装)
1 | npm install koa --save |
3.安装koa2项目生成器并创建项目
1 2 3 4 | cnpm install koa-generator -g koa2 myPro cd myPro cnpm install |
1 | koa2 myPro用来生成项目的基本的项目架构 |
4.启动项目服务
1 | npm start |
这是项目搭建成功的初始页面
搭建项目
接下来进行实战项目的基本搭建
1.安装sequelize(Sequelize是一个基于promise的nodejs ORM,目前支持Postgres、mysql、SQLite和Microsoft SQL Server。它具有强大的事务支持,关联关系,读取和复制等功能。)
1 | cnpm install sequelize --save |
2.安装mysql、mysql2
项目使用的是mysql的数据库
1 | cnpm install mysql mysql2 --save |
3.配置Sequelize的数据库链接
在项目的根目录下创建一个config目录,config目录中创建db.js,该文件主要用来创建mysql的数据库链接的。
/config/db.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | const Sequelize = require( 'sequelize' ); const sequelize = new Sequelize( 'test' , 'root' , '123456' ,{ host: '182.61.15.43' , dialect: 'mysql' , operatorsAliases: false , dialectOptions:{ //字符集 charset: 'utf8mb4' , collate: 'utf8mb4_unicode_ci' , supportBigNumbers: true , bigNumberStrings: true }, pool:{ max: 5, min: 0, acquire: 30000, idle: 10000 }, timezone: '+08:00' //东八时区 }); module.exports = { sequelize }; |
其中test为数据库名称,root为数据库用户名,123456为数据库密码,这是我自己搭建的服务器
4.创建schema、modules、controllers
schema:数据表模型实例
modules:实体模型
controllers:控制器
3个目录下分别创建student.js(有点像thinkPhp5的框架目录)
5.schema数据表模型
在schema目录下新建一个student.js文件,该文件的主要作用就是建立与数据表的对应关系,也可以理解为代码的建表。
schema/student.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | const moment = require( "moment" ); module.exports = function (sequelize,DataTypes){ return sequelize.define( 'student' ,{ id:{ type: DataTypes.INTEGER, primaryKey: true , allowNull: true , autoIncrement: true }, //学生姓名 name:{ type: DataTypes.STRING, allowNull: false , field: 'name' }, //年龄 age:{ type: DataTypes.INTEGER, allowNull: false , field: 'age' }, //性别 gender:{ type: DataTypes.STRING, allowNull: false , field: 'gender' }, //分数 grade:{ type: DataTypes.STRING, allowNull: false , field: 'grade' }, // 创建时间 createdAt:{ type: DataTypes.DATE }, // 更新时间 updatedAt:{ type: DataTypes.DATE } },{ /** * 如果为true,则表示名称和model相同,即user * 如果为fasle,mysql创建的表名称会是复数,即users * 如果指定的表名称本身就是复数,则形式不变 */ freezeTableName: true }); } |
6.模型应用、使用
在项目中modules目录下创建student.js文件,为学生信息表,该文件为文章的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | // 引入mysql的配置文件 const db = require( '../config/db' ); // 引入sequelize对象 const Sequelize = db.sequelize; // 引入数据表模型 const student = Sequelize. import ( '../schema/student' ); student.sync({force: false }); //自动创建表 class studentModel { /** * 创建学生表模型 * @param data * @returns {Promise<*>} */ static async createStudent(data){ return await student.create({ name: data.name, //姓名 age: data.age, //年龄 gender: data.gender, //性别 grade: data.grade //分数 }); } /** * 查询学生信息的详情 * @param id 学生信息ID * @returns {Promise<Model>} */ static async getStudentDetail(id){ return await student.findOne({ where:{ id } }); } } module.exports = studentModel; |
7controller 控制器
控制器的主要作用为功能的处理,项目中controller目录下创建article.js,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | const StudentModel = require( "../modules/student" ); class studentController { /** * 创建学生信息 * @param ctx * @returns {Promise.<void>} */ static async create(ctx){ //接收客服端 let req = ctx.request.body; if (req.name && req.age && req.gender && req.grade){ try { //创建学生信息模型 const ret = await StudentModel.createStudent(req); //使用刚刚创建的学生信息ID查询学生信息详情,且返回学生信息详情信息 const data = await StudentModel.getStudentDetail(ret.id); ctx.response.status = 200; ctx.body = { code: 200, msg: '创建学生信息成功' , data } } catch (err){ ctx.response.status = 412; ctx.body = { code: 412, msg: '创建学生信息失败' , data: err } } } else { ctx.response.status = 416; ctx.body = { code: 200, msg: '参数不齐全' } } } /** * 获取文章详情 * @param ctx * @returns {Promise.<void>} */ static async detail(ctx){ let id = ctx.params.id; if (id){ try { // 查询学生信息详情模型 let data = await StudentModel.getStudentDetail(id); ctx.response.status = 200; ctx.body = { code: 200, msg: '查询成功' , data } } catch (err){ ctx.response.status = 412; ctx.body = { code: 412, msg: '查询失败' , data } } } else { ctx.response.status = 416; ctx.body = { code: 416, msg: '学生ID必须传' } } } } module.exports = studentController; |
8.路由
路由,也可以简单理解为路径,主要是作为请求的url,请求的路径来处理一些请求,返回数据。一般情况下,基于node的项目,路由都是在一个叫做routes的目录下面。
routes目录下创建student.js,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | const router = require( 'koa-router' )() // 学生 const StudentController = require( '../controllers/student' ); router.prefix( '/student' ) /** * 学生接口 */ //创建学生 router.post( '/student/create' ,StudentController.create); //获取学生详情 router.get( '/student/:id' ,StudentController.detail) module.exports = router |
然后在app.js添加如下内容
1 2 | const student = require( './routes/student' ) app.use(student.routes(), student.allowedMethods()) |

如果启动过程中出现上图的结果,说明服务启动成功
接下来,就可以测试接口了。
10.解决跨域
跨域是web开发中不可避免的一个必须要解决的问题了。跨域问题,主要是要解决服务器端的通信问题。在node的开发中,只需要实现一个CORS标准就可以了。
1 | cnpm install koa-cors --save |
然后在根目录下的app.js加入koa-cors的引用:
1 2 | const cors = require( 'koa-cors' ) app.use(cors()) //使用cors |
然后重新启动服务。
接下来使用postman进行接口的测试
接口返回成功
使用Navicat查看test数据库下面的表,如图
已经在test下创建了一张student新表,关于koa2的项目搭建先简单介绍到这里吧,算是对所有知识的一个小总结。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?