一、koa-generator使用
- 安装:npm install -g koa-generator
- 创建项目:koa2 -e project(-e是指ejs模版)
- 进入项目安装依赖包:npm install
- 启动项目npm start(热更新选择npm run dev)
- 当项目出现:node bin/www 表示项目已经跑起来
# npm install -g koa-generator
# koa2 -e project
# cd project
# npm install
# npm run dev
二、koa异步操作async
- async异步的概念和使用场景?
async用来定义一个返回 AsyncFunction 对象的异步函数,它会通过一个隐式的 Promise 返回其结果。如果你在代码中使用了异步函数,它以同步的写法去执行异步的代码;使用场景:连续的异步请求下,下一步的异步请求依赖于前一步的异步请求结果。
- 回顾promise与async区别?
promise是通过回调函数不断调用.then方法去执行下面的方法连续操作;async以同步的写法去执行异步的代码,拿到执行结果,async其实是promise的语法糖。写法上更优雅。可读性更高。解藕性高
-
什么时候用await?
当外层函数有async的时候,内部没有await是可以的;函数内部有await,外层一定要有async。否则会报错。await后面一定是Promise对象,如果不是会自动包装成Promise对象,其实async是Promise的语法糖,内部帮我们做了处理
index.js
# 在node中全局对象不是window,是global # ctx:ctx对象挂载了所有信息,可以拿到上下文中的 request 与 response 对象; router.get('/testAsync', async (ctx, next) => { global.console.log('start', new Date().getTime()); let a = await new Promise((resolve, reject) => { setTimeout(() => { global.console.log('async a', new Date().getTime()); resolve('a') }, 1000) }) let b = await 'b'; ctx.body = { a, b } })
三、koa中间件
创建方式和基础用法
- 创建中间件文件夹middleware
- 在middleware中创建我们自己的中间件,比如:koa-pv.js
- 编写方法。最后导出,导出必须是一个函数,函数中同样需要返回一个异步函数,函数参数next()必须调用(因为当前中间件运行完毕后调用下一个,next相当于触发器)
- 在app.js中引入自己的中间件
-
app.use(“自己中间件引入的名字”)去引用
koa-pv.js
# mkdir middleware # touch middleware/koa-pv.js function pv(ctx) { global.console.log(`pv:${ctx.path}`) } module.exports = function () { return async function (ctx, next) { global.console.log(`pv start`) pv(ctx) await next() //中间件运行完毕后调用下一个,next相当于触发器 global.console.log(`pv end`) } }
app.js
const Koa = require('koa') const app = new Koa() const pv = require('./middleware/koa-pc') app.use(pv());
刷新页面在我们控制台里可以看到我们的刚才中间间中打印出来的内容
koa中间件原理
- 首先看上面的图。koa也就是一个服务端框架,接受所有浏览器发出的请求
- 经过内部运转(ctx)
- 返回并给浏览器响应
- 这个洋葱形状的延伸出来的其实都是中间件。比如注册的manager,重定向等这些中间件在我们项目初始化的都会去执行。
- 再说下中间件引入和执行顺序问题,其实我们看洋葱圈是整个的,进来会执行,出去也会执行。无论不管在哪里,都会被执行。所以他的引用顺序和代码顺序可以不一致
- 代码最终都会在执行机制还会回去。一进一出。
四、koa路由
- 进入routes目录下,创建我们相关的路由文件
- 引入koa-router,编写接口,最后导出router
-
在app.js中引入,并使用
login.js
# touch routes/login.js const router = require('koa-router')() router.prefix('/login') //前缀对应页面。模块化去区分 router.get('/',async (ctx,next)=>{ await ctx.render('login', { title: 'Hello login!' }) } router.get('/bar',async (ctx,next)=>{ ctx.body={ code: 0, data:{ count:1 } } }) module.exports = router
app.js
# 在app.js中引入login.js const Koa = require('koa') const app = new Koa() const login = require('./routes/login') app.use(login.routes(), login.allowedMethods())
五、koa中cookies的使用?
- 读 ctx.cookies.get('pvid')
- 写 ctx.cookies.set('pvid', Math.random())
-
需要用到时看API即可。
const router = require('koa-router')() router.prefix('/login') router.get('/', async (ctx, next) => { ctx.cookies.set('pvid', Math.random()) await ctx.render('login', { title: 'Hello login!' }) }) router.get('/bar', async (ctx, next) => { ctx.body = ctx.cookies.get('pvid'); }) module.exports = router
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。