创建koa2项目步骤
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项目步骤相关推荐
- idea创建web项目步骤
idea创建web项目步骤 好多朋友在使用IDEA创建项目时,总会碰到一些小问题. 现在我们就演示一下使用IDEA创建web项目的完整步骤吧. 一. File --> new -->pro ...
- ui vue 创建项目教程 并关闭语法_使用vue ui命令创建vue项目步骤
1.前置环境 1.node.js 2.vue-cli 3.webstorm 2.创建步骤 1.在webstorm中打开一个终端,输入 #vue ui 运行结束后,会启动一个web服务用以可视化创建vu ...
- vs2019创建c++项目步骤_创建django项目的步骤(超级详细)
创建django项目时的操作步骤如下所示: 一.在cmd环境里创建项目,代码如下所示: C:WindowsSystem32>F:F:>cd it2F:IT2>cd pythonF:I ...
- 使用vite创建vue项目步骤
由之前使用@vue/cli创建vue项目,改为用vite创建 使用步骤 使用以下命令实现使用vite创建vue项目: npm init vite-app <project-name> 相比 ...
- 微信开发者工具创建vue项目步骤
在我开始学习vue的时候,对于新手安装这个环境是真的搞人心态,不友好.在不断的安装,找教程,又帮同学配置了下,有必要自己总结下.对于新手搭建vue环境,就一步步来就ok了. 在用 Vue 构建大型应用 ...
- Scrapy创建爬虫项目步骤
Scrapy创建爬虫项目 1.打开cmd命令行工具,输入scrapy startproject 项目名称 2.使用pycharm打开项目,查看项目目录 3.创建爬虫,打开CMD,cd命令进入到爬虫项目 ...
- vue2.0 创建vue项目步骤
1.提前安装好node 2.可以cmd在自带的命令行中运行,也可以在编辑器中运行 cnpm npm install -g cnpm --registry=https://registry.npm.ta ...
- idea创建javaweb项目步骤超详细(2022最新版本)
目录 前言必读 一.新建文件 1.在idea里面点击文件-新建-项目 2.新建项目-更改名称为自己想要的项目名称-创建 3.右键自己建立的项目-添加框架支持(英文版是Add Framework Sup ...
- Vue3实现备忘录|用vite创建vue项目步骤
目录 运行结果展示 创建项目 备忘录功能实现 本文使用的IDE是VSCode,node.js是16. 运行结果展示 实现的功能有 输入框回车添加任务,鼠标悬停显示删除按钮并可以删除单条任务,一键移除 ...
最新文章
- MySQL图形处理软件Navicat字体配置(乱码解决)
- 用LuaBridge为Lua绑定C/C++对象
- 将数据转化成字符串时:用字符串的链接 还是 StringBuilder
- Scanner的用法强化
- 【android】apk在线升级
- 菜鸟入门Docker
- 【一江水 一家人】 盘龙区打造铸牢中华民族共同体意识盘龙江示范带
- rhel centos 源_Rhel centos 7的fips脚本
- JavaWeb-10课Filter过滤器
- 汇编语言--LC3tools实现两个32位数相加
- 小米6刷MIUI12.5(miui12.5)超级详细教程
- 用Java实现成绩等级划分
- CleanMyMacX4.15好用吗?CleanMyMac X2023安全吗?
- Babel 学习日记(0)
- cuda安装失败原因汇总
- python直接进行逐步回归_【Python】逐步回归
- flask中的session伪造问题
- mysql 设置字符集
- FM,FFM,DeepFM
- 青岛abb焊接机器人编程招聘_ABB焊接机器人程序编制技巧
热门文章
- 百度地图 | 定位到大西洋的几内亚湾的解决方法
- Netattest EPS-ST05身份验证平台
- 生成keytab脚本
- Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)
- 【NI Multisim 14.0操作实例——最小系统电路】
- 解析FeatureCollection(Geotools对geojson操作出现的问题)
- com.ibm.mq.MQException: MQJE001: 完成代码为“2”,原因为“2495”。 no mqjbnd64 in java.library.path
- Luogu 2495 [SDOI2011]消耗战
- 力扣 第314场周赛 Q3 使用机器人打印字典序最小的字符串【难度:中等,rating: 1953】(栈+贪心)
- YOLOv5/v7 的改进点合集导航页 (新增YOLOv5/v7网络结构图)