koa初学

117 阅读4分钟

一、koa和express的区别

1、koa 轻量级,基于co中间件框架,框架自身并没集成太多功能,大部分功能需要用户自行require中间件去解决

express 基于Connect中间件框架,框架自身封装了大量便利的功能,比如路由、视图处理。使用方式是express()

2、Express 和 Koa 最明显的差别就是 Handler 的处理方法,一个是普通的回调函数,一个是利用生成器函数(Generator Function)来作为响应器。根本原理就是 Express 是在同一线程上完成当前进程的所有 HTTP 请求,而 Koa 利用 co 作为底层运行框架,利用 Generator 的特性,实现“协程响应”。

3、 Express 使用 callback捕获异常,对于深层次的异常捕获不了,Koa 使用 try catch,能更好地解决异常捕获。但是可以通过自己写一个express中间件来解决这个问题。

4、express是非严格的洋葱模型,koa是严格的洋葱模型

中间件:类似于过滤器,用于客户端和应用程序之间处理请求和响应的方法。中间件执行类似于剥洋葱。但并非一层一层的执行,而是以next为分界,先执行本层next之前的部分,当下一层中间件执行完毕后再执行本层next之后的部分。 中间件是为了解决复杂应用中频繁回调而设计的级联式代码,它并不直接将控制权完全交给下一个中间件,而是碰到next后去下一个中间件,等到下面都执行完毕后再执行next后续代码。

二、koa用法

使用koa-generate脚手架创建项目 controller db app.js

const Koa = require('koa')
const app = new Koa()
// 引入中间件
require('xx')
app.use('xx')
// 引入routes
const index = require('./routes/index')
app.use(index.routes(), index.allowedMethods())
router中引入controller
router.post()
const koa = require("koa")
const router = require("koa-router")() // 路由
const render = require("koa-art-template") // 引入art-template
const bodyParser = require("koa-bodyparser") // 为了把请求的参数放在ctx.request.body
const static = require("koa-static") // 解析静态文件
const path = require('path');
const DB = require("./module/db")

const app = new koa()
app.use(bodyParser())

// 配置静态服务中间件 // 可配置多个
// app.use(static(__dirname + "/static"))
app.use(static(__dirname + "/ouDotPc"))

// app.use(static(__dirname + "/dist")) // 前端打包文件


// 3. 配置 koa-art-template模板引擎
render(app, {
  root: path.join(__dirname, 'ouDotPc'), // 视图的位置
  extname: '.html', // 后缀名 如:index.html
  debug: process.env.NODE_ENV !== 'production' //是否开启调试模式

})


// koa中的路由 返回index.html页面
router.get("/", async (ctx) => {
  //设置kookie
  ctx.cookies.set("userinfo", "zhangsan", {
    maxAge: 60 * 1000, // cookis过期时间60秒
    // path: "/news", // 可以访问cokie的页面吧
    // domain:".baidu.com", // 默认当前域名下可访问,可设置哪些域名可访问kookie
    // httpOnly:false, // 是否只有服务器可访问kookie

  })

  const data = await DB.find("order_item", {}) //数据库中查询表“order_item”

  
  await ctx.render('index', { // 4. 传参 渲染koa-art-template模板 index.html
    list: data
  })
})

// koa中的路由 返回add.html页面
router.get("/add", async (ctx) => {

  await ctx.render('add')
})

// koa中的路由 返回doAdd.html页面
router.post("/doAdd", async (ctx) => {

  const data = ctx.request.body

  const result = await DB.insert("order_item", data)
  try{
    if (result.acknowledged) {
      ctx.redirect("/")
    }
  }catch(err){
    console.log(err);
    return
  }
  
  
})


// koa中的路由 返回edit.html页面
router.get("/edit", async (ctx) => {
  const id = ctx.query.id // 获取参数
  const data = await DB.find("order_item", {"_id":DB.getObjectId(id)}) // 数据库中查询对应id的数据
  await ctx.render('edit', { // 4. 传参 渲染koa-art-template模板 edit.html
    userBbj: data[0]
  })
})

//POST接口 koa中的路由 返回doEdit.html页面
router.post("/doEdit", async (ctx) => {

  const filterJson = ctx.request.body // 获取post参数
  
  const result = await DB.update("order_item", {
    "_id": DB.getObjectId(filterJson.id)
  }, filterJson)
  
  if (result.acknowledged) {
    ctx.redirect("/")
  } else {
    ctx.body = result
  }
})

// koa中的路由 删除操作
router.get("/delete", async (ctx) => {
  const id = ctx.query.id
  const result = await DB.remove("order_item", {"_id":DB.getObjectId(id)})
  if (result.acknowledged) {
    ctx.redirect("/")
  }else{
    ctx.body = result
  }
})

app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3000)

controller中引入数据库模型  new User()实现增删改查

# 三、连接mongoose数据库
```js
const mongoose = require('mongoo// routes
const index = require('./routes/index')
app.use(index.routes(), index.allowedMethods())se');
const db = mongoose.connect("mongodb://localhost:27017/test", {useNewUrlParser:true}, function(err){
  if(err){
    console.log(err)
  }else{
    console.log("Connection success!")
  }
})
const Schema = mongoose.Schema;

// 用户
let userSchema = new Schema({
  user_name: String,
  user_id: String,
  user_pwd: String,
  avatar: {
    type: String,
    default: ""
  },
  token: {
    type: String,
    default: ""
  }
})
const User = mongoose.model('User', userSchema)

User.find({})

四、mongodb语法

启动本地的mongodb
C:\Program Files\MongoDB\Server\3.4\bin>mongo -dbPath D:\MongoDB\data

1、常用查询并排序
db.getCollection('表名').find({"name" : "测试套餐1111"}).sort({"createDate":-1})     
注:1为升序,-1为降序

2、多条件or查询
db.getCollection('UserEntity').find({$or:[{"phone" : "18700000000"},{"phone" : "13400000000"}]})

3、多条件and查询
db.getCollection('UserEntity').find({"phone" : "18700000000","phone" : "13400000000"})

4、模糊查询
db.getCollection('UserEntity').find({"name" : /测试/})

5、查询去重后name列数据
db.getCollection('UserEntity').distinct("name")

6、只查询5条数据
db.getCollection('UserEntity').find().limit(5)

7、查询5-10之间数据    
db.getCollection('UserEntity').find().limit(10).skip(5)

8、查询记录条数
db.getCollection('UserEntity').find().count()

9、分组查询
//单个字段分组查询
db.getCollection('UserEntity').aggregate([{$group : {_id : "$balance", num : {$sum: 1}}}])  

//多个字段分组查询
db.getCollection('UserEntity').aggregate([{$group : {_id : {balance:"$balance",expressInc:"$expressInc"}, num : {$sum : 1}}}]) 

五、mongoose语法

new User()
save()
findOne()
findOneAndUpdate()
findOneAndDelete()

六、egg是在koa上的封装。

koa没有controller,service,router,所以egg加入了这些,并且约定了文件目录结构,等等,这样的话,更利于工程化的开发。