koa2+mysql实现RESTful API

2023-11-07 18:50

本文主要是介绍koa2+mysql实现RESTful API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先贴上项目地址:https://gitee.com/wuchunling/koa2-mysql

再上postman测试效果图

 

看看最终的项目结构如下

-koa2+mysql

 - model 数据库表设计

 - routers 路由

 - static 静态资源  // 现在暂时用不到

 - utils 封装工具函数

 - app.js 启动文件

 - config.js 配置文件

 

 

第一步:在项目根目录下安装 koa koa-bodyparser等依赖模块

最终依赖文件package.json如下

{"name": "koa2","version": "1.0.0","description": "koa2 实现 restful api","repository": {"type": "git","url": ""},"author": "wuchunling","license": "MIT","dependencies": {"glob": "^7.1.3","jsonwebtoken": "^8.4.0","koa": "^2.6.2","koa-body": "^4.0.4","koa-bodyparser": "^4.2.1","koa-cors": "0.0.16","koa-jwt": "^3.5.1","koa-router": "^7.4.0","koa-session": "^5.10.0","koa-static": "^5.0.0","mysql": "^2.16.0"}
}

 

最终app.js如下

//启动文件(入口文件)
const Koa = require('koa')
const bodyParser  = require('koa-bodyparser')   //上下文解析
const static = require('koa-static')    //静态资源服务
const path = require('path')
const cors = require('koa-cors')       //跨域访问组件
const registerRouter = require('./routers/index')
const app = new Koa()
require('./model/index')
// 配置静态资源文件
const  staticPath = './static'
app.use(static(path.join( __dirname, staticPath)
))
app.use(cors()) // 允许跨域访问
app.use(bodyParser()) // body解析
app.use(registerRouter())
app.listen(3000)
console.log("启动成功")

 

 

第二步: 配置文件,配置数据库的基本信息。我用的是mysql数据库,默认端口号是3306。

config.js如下

//配置文件:数据库配置/日志配置/服务配置/....const config = {port:3000,  // 项目启动端口号database:{   // 数据库配置信息host:'localhost',port:'3306',user:'用户名',password:'密码',database:'数据库名'}
}module.exports = config;

 

 

第三,安装nodejs的mysql模块,建立mysql连接,封装通用的sql请求函数query

3.1 利用第二步的数据库配置信息,建立连接池 mysql.createPool(config)

const config = require('../config').database
const mysql = require('mysql')
const pool = mysql.createPool(config)

3.2 封装一个通用的sql查询语句函数

const query = function(sql,succCb,errCb){pool.getConnection(function(err,conn){if (err) {let data = {code:500,message:"请求失败",data:err};errCb(data);}else {conn.query(sql,function(err,result){if (err) {let data = {code:500,message:"请求失败",data:err};errCb(data);}else {succCb(result);conn.release();}})}})
}
module.exports = query;

query(sql,succCb,errCb)的三个参数,

第一个sql,传递的是sql语句,例如 'select * from apples'

第二参数succCb,是数据库查询成功的回调函数

第三个参数errCb,是数据库查询失败的回调函数

 

第四步,在第三步query的封装基础上可以进一步封装,代码有点长,戳链接看

https://gitee.com/wuchunling/koa2-mysql/blob/master/utils/sql.js

这一层封装,主要利用Promise对象进行二次封装,方便后续使用async/await进行调用

 

 

 

前面都是工具的准备,接下来可以磨刀霍霍向猪羊了。

接下来进入重头戏router和model的编写。(因为有了前面的工具函数的封装,这两步编写将十分的简单)

 

第五步:model数据模型。对应我们数据库表的结构的编写。以user举例

model.js

const query = require('../utils/query');const tables = {users:`create table if not exists users(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20) NOT NULL,phone CHAR(11) NOT NULL,password VARCHAR(20) NOT NULL,avator VARCHAR(255) DEFAULT 'default.jpg',credit INT NOT NULL DEFAULT 0 ,useCredit INT NOT NULL DEFAULT 0 ,cash INT NOT NULL DEFAULT 0 ,isReal TINYINT NOT NULL DEFAULT 0);`,//用户表// ....可以继续扩充其他表结构
}const createTable = function(tb){query(tb,function(res){// console.log('建表成功');return true;},function(err){console.log('建表失败',err);return false;})
}for (let key in tables) {if (tables.hasOwnProperty(key)) {createTable(tables[key]);}
}

 

第六步:路由的编写

在前面我封装了Sql对象,里面有一些常用的查询方法,①根据表名获取全部数据queryAll,②根据表名和id查询具体某一条数据query③insert④insertRows等等基本的CRUD操作。

const router = require('koa-router')();   //路由
const Sql = require('../utils/sql');
const tbName = 'apples';router.get('/api/apples',async(ctx,next) => {let data = await Sql.queryAll(tbName,ctx.request.query);ctx.body = data;}).get('/api/apples/:id',async(ctx,next) => {let data = await Sql.query(tbName,ctx.params.id);ctx.body = data;}).post('/api/apples',async(ctx,next) => {let data = await Sql.insert(tbName,ctx.request.body);ctx.body = data;}).post('/api/apples/rows',async(ctx,next) => {let data = await Sql.insertRows(tbName,ctx.request.body);ctx.body = data;}).put('/api/apples/:id',async(ctx,next) => {let data = await Sql.update(tbName,ctx.params.id,ctx.request.body);ctx.body = data;}).put('/api/apples',async(ctx,next) => {console.log(ctx.request.body);let data = await Sql.updateRows(tbName,ctx.request.body);ctx.body = data;}).del('/api/apples/:id',async(ctx,next) => {let data = await Sql.delete(tbName,ctx.params.id);ctx.body = data;}).del('/api/apples',async(ctx,next) => {let data = await Sql.deleteRows(tbName,ctx.request.body);ctx.body = data;})
module.exports = router;

 

最后一步,别忘了注册路由

app.use(appleRouter);

但是我们路由文件很多,不可能一个一个import,多累啊,万一漏了那个呢?麻烦。

所以还是利用glob和koa-compose来聚合一下我们routers文件夹下面的的所有路由文件

 

// routers/index.js
const compose = require('koa-compose')
const glob = require('glob')
const { resolve } = require('path')registerRouter = () => {let routers = [];glob.sync(resolve(__dirname, './', '**/*.js')).filter(value => (value.indexOf('index.js') === -1)).map(router => {routers.push(require(router).routes())routers.push(require(router).allowedMethods())})return compose(routers)
}module.exports = registerRouter

最后在主启动文件app.js

const registerRouter = require('./routers/index');

app.use(registerRouter());

即可将全部的路由注册。

 

 

 

node app.js我们的应用就跑起来了。可以调用我们编写好的restful api了。这样就实现了开头的gif图展示的效果了。

 

系不系 very simple啊

 

 

另外,

用于登录注册等需要识别用户身份的,我们用token(jsonwebtoken)

token的加密解密也做一个基本的封装,具体调用方法戳链接

https://blog.csdn.net/qq_30604453/article/details/85060077

const jwt = require('jsonwebtoken');
const Token = {encrypt:function(data,time){ //data加密数据,time过期时间return jwt.sign(data, 'token', {expiresIn:time})},decrypt:function(token){try {let data = jwt.verify(token, 'token');return {token:true,id:data.id};} catch (e) {return {token:false,data:e} }}
}
module.exports = Token

 

 

这篇关于koa2+mysql实现RESTful API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365608

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字