koa2是基于 Node.js 平台的下一代 web 开发框架, 致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 可以避免异步嵌套. express中间件是异步回调,Koa2原生支持async/await
const { rejects } = require("assert");
const { resolve } = require("path/posix");
// 普通函数
const getData1 = ()=>{
return { uname: "普通函数"}
}
console.log(getData1()); // { uname: '普通函数' }
// async + 普通函数
const getData2 = async ()=>{
return { uname: "async + 普通函数"}
}
console.log(getData2()); // Promise { { uname: '普通函数' } }
getData2().then(data=>{
console.log(data); // { uname: 'async + 普通函数' }
})
const getData3 = (params)=>{
return new Promise((resolve,reject)=>{ //resolve 成功的结果, reject失败的结果
if(!params){
reject({ err:'参数为空!' })
}else{
resolve({ message: "成功!" })
}
})
}
getData3().then(data=>{
console.log("1resolve传的数据", data)
}).catch(err=>{
console.log("1reject传的数据---",err);
}) //reject传的数据--- { err: '参数为空!' }
// 异步函数使用.catch接收错误信息, 同步函数使用try{}catch{}
getData3(222).then(data=>{
console.log("2resolve传的数据", data)
}).catch(err=>{
console.log("2reject传的数据---",err);
}) //2resolve传的数据 { message: '成功!' }
项目初始化 npm init -y
安装 npm i koa -g
使用脚手架的方式安装 npm install -g koa-generator
创建项目 koa2 koapro[koapro 项目名称]
配置前的项目启动 npm start koapro 或 npm run start
// 引入路由
const books = require('./routes/books')
// 注册路由
app.use(books.routes(), books.allowedMethods())
get请求, 在获取参数时,可直接使用 ctx.query
const { searchList } = require('../utils/mysqlUtils')
// 引入koa
const router = require('koa-router')()
// 设置路由前缀
router.prefix('/books')
// 设置路由
router.get('/search',async (ctx,next)=>{ //ctx 相当于 req,res
// 页面显示内容
// 方式1: 直接使用ctx.body
// ctx.body = 'hahah'
// 方式2: 使用模板渲染
/* await ctx.render('index',{
title: '哈哈哈哈'
}) */
//注意 async/await的使用, 避免无法返回查询结果
await searchList(ctx, 'books')
})
// 导出
module.exports = router
post 请求, 在获取参数时, 使用 ctx.request.body 接收
const router = require('koa-router')()
const { login } = require('../utils/mysqlUtils')
router.prefix('/users')
router.post('/login', async function (ctx, next) {
await login(ctx,'users')
})
module.exports = router
const mysql = require('mysql')
// 加密模块中的随机生成数
const sqlconfig = require('../config/sqlconfig')
// 使用连接池 pool.createPool()
let pool = mysql.createPool(sqlconfig)
// 执行数据库
const exec = (sql) => {
return new Promise((resolve, reject) => {
pool.getConnection((err, conn) => {
if (err) {
//连接错误
reject(err)
} else {
//连接成功
conn.query(sql, (err, data) => {
if (err) {
//操作失败
reject(err)
} else {
resolve({
code: 0,
message: '操作成功!',
data,
})
// resolve(data)
}
})
}
// 当连接不再使用时,用conn对象的release方法将其归还到连接池中
conn.release()
})
})
}
// 查询 获取get请求参数使用 ctx.query
const searchList = async(ctx, table) => {
// 根据输入的查询条件查找数据 若无参数则查询所有
let sql = `select * from ${table} where 1=1`
let keys = Object.keys(ctx.query)
let values = Object.values(ctx.query)
let keyArr = []
let valArr = []
let str = ''
let i = 0
keys.forEach((item,index)=>{
keyArr.push(item.trim())
valArr.push(`${values[index].trim()}`)
str += ` and ${keyArr[i]} like '%${valArr[i]}%' `
i++
})
sql += str
const data = await exec(sql)
ctx.body = data
}
const login = async (ctx, table)=>{
// 根据 phone / email 作为账号来登录 输入内容不为空, 判断是Email还是phone 根据对应信息查询数据, 如果能查到则登录成功, 否则登陆失败
let paramsArr = Object.values(ctx.request.body)
// 有数据
let flag = 0
if(paramsArr && paramsArr.length > 0){
// 遍历数组,并去空
paramsArr.forEach(item => {
if(item.trim().length === 0){
flag++
}
})
// 账号 密码存在
if(flag === 0 && ctx.request.body.password.length > 0){
let username = paramsArr.toString().indexOf('@') > 0 ? 'email' : 'phone'
let sql = `select * from users where `
if(username === 'email'){
const {password , email } = ctx.request.body
// 邮箱登录
sql += ` password = '${ password }' and email = '${email}' `
console.log(sql);
// 查询数据, 查到则登录成功
await exec(sql).then(result=>{
console.log(result.data);
if(result.data.length > 0){
ctx.body= {
code: 1,
message: '登录成功!',
result
}
}else{
ctx.body= {
code: 0,
message: '登录失败!'
}
}
})
}
if(username === 'phone'){
const {password , phone } = ctx.request.body
// 邮箱登录
sql += ` password = '${ password }' and phone = '${phone}' `
console.log(sql);
// 查询数据, 查到则登录成功
await exec(sql).then(result=>{
// console.log(result);
if(result.data.length > 0){
ctx.body= {
code: 1,
message: '登录成功!',
result
}
}else{
ctx.body= {
code: 0,
message: '登录失败!'
}
}
})
}
}else{
// 账号或密码为空
ctx.body= {
code: -1,
message : "账号或密码不能为空!"
}
}
}else{
ctx.body= {
code: -1,
message : "账号和密码不能为空!"
}
}
}
module.exports = {
searchList,
login
}
源代码放在这里啦~~~