简捷的5行代码,帮我们开启了3000端口的服务深入理解Koa中间件之洋葱模型学习Koa重点在于理解中间件实现原理,对后续引用第三方库中间件时候有更好了解。我们单独讲讲
你可能对运行的结果会说 1234,其实不然,我们先来看下输出结果
一脸懵逼1342,这是什么顺序,这就是我们要说的洋葱模型
假如我们想为单个页面设置层级,/home是我们首页,再次基础上有/home/list 首页列表页 /home/todo 首页todo页。这时我们就需要用到嵌套路由,看看怎么用const Koa = require('koa');const app = new Koa();const Router = require('koa-router');//home的路由let home = new Router();home.get('/list',async(ctx)=>{ ctx.body="Home list";}).get('/todo',async(ctx)=>{ ctx.body ='Home ToDo';});//page的路由let page = new Router();page.get('/list',async(ctx)=>{ ctx.body="Page list";}).get('/todo',async(ctx)=>{ ctx.body ='Page todo';});//装载所有子路由let router = new Router();router.use('/home',home.routes(),home.allowedMethods());router.use('/page',page.routes(),page.allowedMethods());//加载路由中间件app.use(router.routes()).use(router.allowedMethods());app.listen(3000);复制代码
这样一来就实现嵌套路由的写法
测试下,学过vue应该比较熟悉
当post提交表单获得表单数据,测试下结果
来个demo体验下,我们把本地的1.txt文件上传到upload文件夹中。 1.txt内容为123456789let Koa = require('koa');let app = new Koa();let betterBody = require('koa-better-body'); // v1插件 let convert = require('koa-convert'); // 将1.0的中间件 转化成2.0中间件app.use(convert(betterBody({ uploadDir: __dirname //指定上传的目录 __dirname当前文件夹绝对路径})))app.use(async (ctx, next) => { if (ctx.path === '/' && ctx.method === 'GET') { ctx.set('Content-Type', 'text/html;charset=utf8'); ctx.body = ` <form action="/" method="post" enctype="multipart/form-data"> <input type="text" name="username" autoComplete="off"> <input type="text" name="password" autoComplete="off"> <input type="file" name="avatar"> <input type="submit" > </form> ` } else { return next(); }});app.use(async (ctx, next) => { if (ctx.method === 'POST' && ctx.path === '/') { // 获取表单提交过来的数据 ctx.body = ctx.request.fields; }});app.listen(1000);复制代码
看下上传结果
内容也是正确的,我就不给大家展示拉4、kao-views中间件
我们以ejs为例子let Koa = require('koa');let app = new Koa();let views = require('koa-views');app.use(views(__dirname,{ extension:'ejs' //指定用ejs模板}));app.use(async (ctx,next)=>{ // 渲染index.ejs await ctx.render('index',{name:'cgp',age:9,arr:[1,2,3]});});app.listen(3000);复制代码
比如我们要存储用户名,保留用户登录状态时,会用到cookie。共两个方法
先来个demo测试,当输入/write写入cookie,当输入/read读到cookielet Koa = require('koa');let Router = require('koa-router');let app = new Koa();let router = new Router();router.get('/read', (ctx, next) => { //有name读name let name = ctx.cookies.get("name") || '没有name'; let age = ctx.cookies.get("age") || '没有age'; ctx.body = `${name}-${age}`;});router.get('/write', (ctx, next) => { ctx.cookies.set('name', 'cgp',{ domain:'127.0.0.1', //写入cookie所在的域名 path:'/write', // 写入cookie最大的路径 maxAge:10*1000, //Cookie最大有效时长 httpOnly:false, // 是否只用于http请求中获取 overwrite:false // 是否允许重写 }); ctx.cookies.set('age', '9'); ctx.body = 'write Ok';});app.use(router.routes());app.listen(4000);复制代码Cookie选项
看下运行结果吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |