1.安装koa-generator

npm install -g koa-generator

2.新建项目

koa2 -e my-server

3.安装依赖,启动项目

// cd my-server
npm  install
npm  run dev

4.安装跨域插件

npm i koa2-cors --save

5.配置跨域,在app.js添加如下配置

// 配置跨域
const cors = require('koa2-cors');
app.use(cors({origin: '*',allowMethods: ['GET', 'POST', 'DELETE', 'PUT', 'PATCH', 'OPTIONS'],allowHeaders: ['Content-Type', 'Authorization', 'Accept']
}));

6.链接mysql数据库
首先安装mysql插件

npm install mysql --save

项目根目录创建mysql文件夹,创建mysql.js
项目根目录创建utils文件夹,创建code.js,定义 返回成功失败类型

mysql.js文件中创建数据库链接池,封装增删改查数据返回格式

const mysql      = require('mysql')
const code=require('../utils/code')
console.log(mysql)
// 创建数据池
const pool  = mysql.createPool({host     : '127.0.0.1',   // 数据库地址user     : 'root',    // 数据库用户password : 'yanglian',   // 数据库密码database : 'labour'  // 选中数据库
})// params 进行添加或修改的数据
function poolFn(connecQuery, sql, params) {// getConnection 创建连接池return new Promise((resolve, reject) => {pool.getConnection((err, connection) => {if(err) {reject('建立连接池失败')throw err}connecQuery(connection, sql, params).then(data => {connection.release() // 到这步说明已经完成操作,释放连接resolve(data)})})// console.log(pool._allConnections.length) // 连接池里的连接数})
}
/*
* connection 连接句柄
* sql 查询语句* */// 基于promise方法实现// 查询数据
function find(connection, sql) {return new Promise((resolve, reject) => {connection.query(sql, (err, data) => {// console.log(data)if(err) {reject(err)throw err}resolve(data)})})
}// 添加数据
function add(connection, sql, params) {return new Promise((resolve, reject) => {connection.query(sql, params, (err, result) => {if(err) {resolve({msg:'添加失败',code:code.err,data:null})throw err}resolve({msg:'添加成功',code:code.success,data:null})})})
}// 删除数据
function del(connection, sql) {return new Promise((resolve, reject) => {connection.query(sql, (err, result) => {if(err) {resolve({msg:'删除失败',code:code.err,data:null})throw err}resolve({msg:'删除成功',code:code.success,data:null})})})
}// 修改数据
function update(connection, sql, params) {return new Promise((resolve, reject) => {connection.query(sql, params, (err, result) => {if(err) {reject(err)throw err}resolve(result)})})
}// 将方法封装统一导出function queryFn(connecQuery, sql, params) {return new Promise((resolve) => {poolFn(connecQuery, sql, params).then(data => {console.log(data)resolve(data)})})
}module.exports = {findData(sql, params) {return queryFn(find, sql, params)},addData(sql, params) {return queryFn(add, sql, params)},delData(sql, params) {return queryFn(del, sql, params)},updateData(sql, params) {return queryFn(update, sql, params)}
}

code.js文件创建数据状态

module.exports={success:1,//成功err:0,//失败repeat:2,//重复
}

在mysql文件夹 中创建processData.js,处理最终的数据返回格式

const {findData,addData,delData,updateData
} = require('./mysql')
const code=require('../utils/code')// 这边通过async方法保证数据的同步获取let query = async(ctx,sql,config={}) => { // 获取数据let {params,type='json',isObj}=config// 返回的数据格式为jsonctx.response.type = typeawait findData(sql,params).then(data => {ctx.body = {data:isObj ? data[0] : data,msg:'查询成功',code:code.success}})
}let add = async(ctx,sql,config={}) => { // 添加数据// console.log(ctx)let {params,type='json'}=configctx.response.type =typeconsole.log(params)await addData(sql, params).then(data => {ctx.body = data}, () => {ctx.body = data})
}let del = async(ctx,sql,config={}) => { // 删除数据let {params,type='json'}=configctx.response.type =typeawait delData(sql,params).then(data => {ctx.body = data}, () => {ctx.body = data})
}let update = async(ctx,sql,config={}) => { // 修改数据let {params,type='json',msg='更新成功'}=configctx.response.type =typeawait updateData(sql, params).then(data => {// console.log(data)ctx.body = {data:null,msg,code:code.success}})
}module.exports = {query,add,del,update
}

7.创建一个get请求查询数据库数据

在routes文件夹下创建一个news模块

const router = require('koa-router')()
const msql=require('../mysql/processData')
const myCode=require('../utils/code')
router.prefix('/news')//获取数据库信息
router.get('/list', async function (ctx, next) {await msql.query(ctx,`SELECT * FROM news`)
})module.exports = router

在app.js将news模块导入,这样就可以通过/news/list查询到数据库的信息了

const news = require('./routes/new')app.use(news.routes(), users.allowedMethods())


条件查询如下,使用where操作

router.get('/list', async function (ctx, next) {// sql条件查询语句,匹配content相同的内容await msql.query(ctx,`SELECT * FROM news WHERE content='${ctx.query.content}'`)
})


模糊查询如下,使用like操作

router.get('/list', async function (ctx, next) {// 模糊查询content内容带o的数据await msql.query(ctx,`SELECT * FROM news WHERE content LIKE '%${ctx.query.content}%'`)
})


当我们有更多条件的时候,比如实际项目中的分页查询等,需要很多参数,这样我们就需要封装一个get传递的参数
在utils中创建sqlQs.js,封装两个函数,用来生成精准匹配和模糊查询sql条件字符串

sqlQs.js

// 将对象转换成mysql更新字符串函数
function stringify(obj,config={}) {let {likeArr=[]}=configif(!(obj instanceof Object)){console.error(`${obj}数据格式错误`)return}let qsStr=''for (let i in obj){let connectStr='='let valueGuard=""if(likeArr.includes(i)){//模糊查询connectStr=' like 'valueGuard=`%`}let value=typeof obj[i]==='number' ? obj[i] : `'${valueGuard}${obj[i]}${valueGuard}'`if(!value && value!==0){//没有值的不做拼接continue}qsStr+=`,${i}${connectStr}${value}`}qsStr=qsStr.replace(',','')console.log(qsStr)return qsStr
}
// 将mysql更新字符串函数解析成对象
function parse(str,config={}) {if(typeof str !=='string'){console.error(`${str}数据格式错误`)return}let {likeArr=[]}=configlet strArr=str.split(',')return strArr.reduce((result,current)=>{let likeIndex=likeArr.findIndex(item=>new RegExp(`^${item}`).test(current))let connectStr=likeIndex>-1 ? ' like ' : '='let itemArr=current.split(connectStr)if(likeIndex>-1){result[itemArr[1]]=result[itemArr[1]].replaceAll('%','')}result[itemArr[0]]=result[itemArr[1]]return result},{})
}
module.exports={stringify,parse
}

然后我们将get请求改成

router.get('/list', async function (ctx, next) {let queryObj= {...ctx.request.query}let query=sqlQs.stringify(queryObj,{likeArr:['content']})await msql.query(ctx,`SELECT * FROM news WHERE ${query}`)
})

然后我们再看看返回给前端的数据,会发现返回的时间字符串格式不是前端想要的,直接从数据库查到的时间,带有T,我们得改下返回的时间格式。那么用mysql的DATE_FORMAT语法即可,DATE_FORMAT(time,’%Y-%m-%d %H:%i:%S’) as time。更改过后

router.get('/list', async function (ctx, next) {let queryObj= {...ctx.request.query}query=sqlQs.stringify(queryObj,{likeArr:['companyName']})await msql.query(ctx,`SELECT *,DATE_FORMAT(time,'%Y-%m-%d %H:%i:%S') as time  FROM news WHERE ${query}`)
})

接着我们写一个查看详情接口

router.get('/detail',async (ctx,next) => {let {id} = ctx.request.queryif(!id) {ctx.body = {msg: '参数缺少id',code: myCode.err}return}await msql.query(ctx,`SELECT *,DATE_FORMAT(time,'%Y-%m-%d') as time FROM news WHERE id=${id}`)
})

我们再写一个新增接口,使用post传参,并生成唯一id
先封装一个生成随机id的js文件
在utils文件夹中新建snowflake.js文件,代码如下

module.exports=function getId(pre='',randomLength=10,) {let id= Number(Math.random().toString().substr(3,randomLength)).toString(36)id=`${pre}${id}`return id
}

给news表添加数据

router.post('/add',async (ctx,next) => {let data = {...ctx.request.body}if(!Object.keys(data).length) {ctx.body = {msg: '参数缺少',code: myCode.err}return}for(let i in data){if(!data[i]){ctx.body = {msg: `${i}参数缺少`,code: myCode.err}return}}await msql.add(ctx,`INSERT INTO news SET ?`,{params: {...ctx.request.body,id:0}})
})

修改操作代码

router.post('/add',async (ctx,next) => {let data = {...ctx.request.body}if(!Object.keys(data).length) {ctx.body = {msg: '参数缺少',code: myCode.err}return}for(let i in data){if(!data[i]){ctx.body = {msg: `${i}参数缺少`,code: myCode.err}return}}let id = ctx.request.body.idif(id){let params = {...ctx.request.body}delete params.idparams = sqlQs.stringify(params)await msql.update(ctx,`UPDATE news SET ${params} WHERE id=${id}`)} else {await msql.add(ctx,`INSERT INTO news SET ?`,{params: {...ctx.request.body,id:0}})}
})

删除操作

router.get('/del',async (ctx,next) => {let {id}=ctx.request.queryif(id) {await msql.del(ctx,`DELETE FROM news WHERE id=${id}`)} else {ctx.body = {data:null,msg:'删除失败',code:myCode.err}}})

至此,增删改查的操作已经完成

创建koa2项目步骤相关推荐

  1. idea创建web项目步骤

    idea创建web项目步骤 好多朋友在使用IDEA创建项目时,总会碰到一些小问题. 现在我们就演示一下使用IDEA创建web项目的完整步骤吧. 一. File --> new -->pro ...

  2. ui vue 创建项目教程 并关闭语法_使用vue ui命令创建vue项目步骤

    1.前置环境 1.node.js 2.vue-cli 3.webstorm 2.创建步骤 1.在webstorm中打开一个终端,输入 #vue ui 运行结束后,会启动一个web服务用以可视化创建vu ...

  3. vs2019创建c++项目步骤_创建django项目的步骤(超级详细)

    创建django项目时的操作步骤如下所示: 一.在cmd环境里创建项目,代码如下所示: C:WindowsSystem32>F:F:>cd it2F:IT2>cd pythonF:I ...

  4. 使用vite创建vue项目步骤

    由之前使用@vue/cli创建vue项目,改为用vite创建 使用步骤 使用以下命令实现使用vite创建vue项目: npm init vite-app <project-name> 相比 ...

  5. 微信开发者工具创建vue项目步骤

    在我开始学习vue的时候,对于新手安装这个环境是真的搞人心态,不友好.在不断的安装,找教程,又帮同学配置了下,有必要自己总结下.对于新手搭建vue环境,就一步步来就ok了. 在用 Vue 构建大型应用 ...

  6. Scrapy创建爬虫项目步骤

    Scrapy创建爬虫项目 1.打开cmd命令行工具,输入scrapy startproject 项目名称 2.使用pycharm打开项目,查看项目目录 3.创建爬虫,打开CMD,cd命令进入到爬虫项目 ...

  7. vue2.0 创建vue项目步骤

    1.提前安装好node 2.可以cmd在自带的命令行中运行,也可以在编辑器中运行 cnpm npm install -g cnpm --registry=https://registry.npm.ta ...

  8. idea创建javaweb项目步骤超详细(2022最新版本)

    目录 前言必读 一.新建文件 1.在idea里面点击文件-新建-项目 2.新建项目-更改名称为自己想要的项目名称-创建 3.右键自己建立的项目-添加框架支持(英文版是Add Framework Sup ...

  9. Vue3实现备忘录|用vite创建vue项目步骤

    目录 运行结果展示 创建项目 备忘录功能实现 本文使用的IDE是VSCode,node.js是16. 运行结果展示  实现的功能有 输入框回车添加任务,鼠标悬停显示删除按钮并可以删除单条任务,一键移除 ...

最新文章

  1. MySQL图形处理软件Navicat字体配置(乱码解决)
  2. 用LuaBridge为Lua绑定C/C++对象
  3. 将数据转化成字符串时:用字符串的链接 还是 StringBuilder
  4. Scanner的用法强化
  5. 【android】apk在线升级
  6. 菜鸟入门Docker
  7. 【一江水 一家人】 盘龙区打造铸牢中华民族共同体意识盘龙江示范带
  8. rhel centos 源_Rhel centos 7的fips脚本
  9. JavaWeb-10课Filter过滤器
  10. 汇编语言--LC3tools实现两个32位数相加
  11. 小米6刷MIUI12.5(miui12.5)超级详细教程
  12. 用Java实现成绩等级划分
  13. CleanMyMacX4.15好用吗?CleanMyMac X2023安全吗?
  14. Babel 学习日记(0)
  15. cuda安装失败原因汇总
  16. python直接进行逐步回归_【Python】逐步回归
  17. flask中的session伪造问题
  18. mysql 设置字符集
  19. FM,FFM,DeepFM
  20. 青岛abb焊接机器人编程招聘_ABB焊接机器人程序编制技巧

热门文章

  1. 百度地图 | 定位到大西洋的几内亚湾的解决方法
  2. Netattest EPS-ST05身份验证平台
  3. 生成keytab脚本
  4. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)
  5. 【NI Multisim 14.0操作实例——最小系统电路】
  6. 解析FeatureCollection(Geotools对geojson操作出现的问题)
  7. com.ibm.mq.MQException: MQJE001: 完成代码为“2”,原因为“2495”。 no mqjbnd64 in java.library.path
  8. Luogu 2495 [SDOI2011]消耗战
  9. 力扣 第314场周赛 Q3 使用机器人打印字典序最小的字符串【难度:中等,rating: 1953】(栈+贪心)
  10. YOLOv5/v7 的改进点合集导航页 (新增YOLOv5/v7网络结构图)