一、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加入了这些,并且约定了文件目录结构,等等,这样的话,更利于工程化的开发。