Koa2 articles - brief introduction and use

1. Introduction

koa2 is a next-generation web development framework based on the Node.js platform, committed to becoming a smaller, more expressive, and more robust web framework. Asynchronous nesting can be avoided. Express middleware is an asynchronous callback, and Koa2 natively supports async/await

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

Three. The basic use of koa2

1. Installation and creation

Project initialization npm init -y
install npm i koa -g   
install using scaffolding npm install -g koa-generator
create project koa2 koapro[koapro project name]
project start before configuration npm start koapro or npm run start

2. Routing

(1)app.js

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

(2)routes/books.js

get request, when getting parameters, you can use ctx.query directly

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 request, when getting parameters, use ctx.request.body to receive

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) Connect to the database

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
}

The source code is here~~~

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

Guess you like

Origin blog.csdn.net/qq_54379580/article/details/128995535