当前位置: 首页 > 工具软件 > koa-hbs > 使用案例 >

Koa2篇-简单介绍及使用

羊时铭
2023-12-01

一.简介

koa2是基于 Node.js 平台的下一代 web 开发框架, 致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 可以避免异步嵌套. express中间件是异步回调,Koa2原生支持async/await

二.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: '成功!' }

三.koa2的基本使用

1.安装及创建

项目初始化  npm init -y
安装   npm i koa -g   
使用脚手架的方式安装    npm install -g koa-generator
创建项目   koa2 koapro[koapro 项目名称]
配置前的项目启动  npm start koapro 或 npm run start

2.路由

(1)app.js

// 引入路由
const books = require('./routes/books')
// 注册路由
app.use(books.routes(), books.allowedMethods())

(2)routes/books.js

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

(3)routes/users

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

(4)连接数据库

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
}

源代码放在这里啦~~~

https://download.csdn.net/download/qq_54379580/87443081

 类似资料: