node学习三(koa使用入门)

express和koa文档:

express: http://www.expressjs.com.cn
koa: https://www.koajs.com.cn/#

koa-router:
https://www.jianshu.com/p/7e0798fe46bb
https://www.npmjs.com/package/koa-router

koa中使用cookie,session

koa中使用cookie:

  1. Koa 中设置、获取 Cookie 的值
ctx.cookies.set(name,value,[options])// 设置
ctx.cookies.get(name)// 获取

通过options 设置cookie namevalue:
Koa 中设置中文Cookie,没有办法直接设置,需要将设置的中文转换为base64字符串。比如:

new Buffer('张三').toString('base64'));// 转换成base64字符 串:aGVsbG8sIHdvcmxkIQ==

new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString() // 还原base 64字符串:张三

koa中使用session

当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对, 然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value)。 客户的信息都保存在session中

  1. 安装 express-session
npm install koa-session --save
  1. 引入express-session
const session = require('koa-session');
  1. 设置官方文档提供的中间件
app.keys = ['some secret hurr'];
const CONFIG = {
    key: 'koa:sess', //cookie key (default is koa:sess)
    maxAge: 86400000, // cookie 的过期时间 maxAge in ms (default is 1 days)
    overwrite: true, //是否可以 overwrite (默认 default true)
    httpOnly: true, //cookie 是否只有服务器端可以访问 httpOnly or not (default true)
    signed: true, //签名默认 true
    rolling: false, //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)
    renew: false, //(boolean) renew session when session is nearly expired,
};
app.use(session(CONFIG, app));

当启动应用,并设置了例如:ctx.session.user='123',则会新建一个名为name为'koa:sess'的cookie

  1. 使用
设置值 ctx.session.username = "张三";
获取值 ctx.session.username

koa中间件:

什么是koa中间件

通俗的讲:中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,我们就可以 把它叫做中间件。

  1. 在express中间件(Middleware)是一个函数,它可以访问请求对象(requestobject(req)) , 响应对象(responseobject(res)), 和 web 应用中处理请求-响应循环流程中的中间件,一 般被命名为 next 的变量。在 Koa 中中间件和 express 有点类似。

  2. 中间件的功能包括:
    执行任何代码。 修改请求和响应对象。 终结请求-响应循环。 调用堆栈中的下一个中间件。如果我的 get、post 回调函数中,没有 next 参数,那么就匹配上第一个路由,就不会往下匹 配了。如果想往下匹配的话,那么需要写 next()

例如:

router.get('/',(ctx,next) => {
    console.log('1111');
    next();
})
router.get('/',(ctx,next) => {
  console.log('222');
  ctx.body = 'hello koa';
}:

如果不加next,路由就匹配第一个路由(当前路径),不会继续向下匹配,也就不会输出222。

koa中几种中间件的类别

  1. 应用级中间件
const koa = require('koa');
const router = require('koa-router')();

const app = new koa();

router.use(async (ctx,next) => {
    console.log(111);
    await next();
})
// get请求
router.get('/',(ctx,next)=> {
    ctx.body = 'hello koa'
})
router.get('/news',(ctx,next)=> {
    ctx.body='这是新闻页面'; // 响应的内容
})
app.use(router.routes()); // 作用: 启动路由
app.use(router.allowedMethods());  
app.listen(8080,() =>{
    console.log('starting at port 8080')
});

在上面的代码中不论是访问哪一个路由都会输入111。

  1. 路由级中间件
    路由级中间件顾名思义就对匹配到特定的路由之前或者之后进行一些处理。
router.get('/',(ctx,next) => {
    console.log('1111');
    next();
})
// get请求
router.get('/',(ctx,next)=> {
    ctx.body = 'hello koa'
})

先对匹配到的路由进行处理,然后next的继续向下匹配。

  1. 错误处理中间件
app.use(async (ctx,next) => {
    next();
    if(ctx.status === 404){
        ctx.status = 404;
        ctx.body = '这是一个错误处理中间件'
    }
})

错误中间件的用法就是在路由路由之后进行状态判断或者其他的判断。

  1. 常见第三方中间件
  • koa-static: 用于加载静态资源比如加载css,图片,js等。
const static = require('koa-static');
const staicPath = './static';
app.use(static({
    path.join(_dirname,staicPath);
}))
app.use(static(_dirname+'./public'))
// koa中静态资源中间件可以配置多个
// www.xxx.com/css/index.css  
// 它会去./static/css/index.css文件夹下去找对应的文件,如果没有找到就去public下面去找,然后返回对应的结果。类似于静态资源的托管。
  • koa-bodyparser: 这是一个解析 POST 数据的模块,解决了 Koa 原生 ctx 访问 POST 数据不太便利的问题。
app.use(async ctx => {
  // the parsed body will store in ctx.request.body
  // if nothing was parsed, body will be an empty object {}
  ctx.body = ctx.request.body;
});
  • koa-views: 这是一个让koa配合使用模板工具(ejs,pug)的中间件。
const views=require('koa-views');
app.use(views('views',{
    map:{html:'ejs'},
    // extension: 'ejs'
}));
// 第一个参数是模板文件存放的地址,
// extension: 'ejs' 表示要使用ejs模板引擎
// map:{html:'ejs'},和上面extension一样表示要是使用ejs模板。只是可以在引入文件的时候省略文件后缀。
router.get('/add',async(ctx) =>{ 
    let title='hello koa2' 
    await ctx.render('index',{ 
        title 
    }) 
})
// 如果我们需要给多个模板传入一样的数据,我们可以通过设置一个公共的数据。

// 设置一些公共的数据,可以供模板引擎使用,必须要写入中间件中,这样在所用的render的模板中都可以使用这些数据。比如: 可以直接在index.ejs中使用name,不需要在渲染的时候传入。
app.use(async (ctx) => {
   ctx.state = {
        name: 'zhangsan',
  };
})

这里render里面第一个参数是文件的地址(相对于你前面设置的文件夹,上面是view文件夹下),第二个参数为传入的数据。

  • koa-art-template:是一种是一个简约、超快的模板引擎,采用作用域预声明的技术来优化模板渲染速度。
const Koa=require('koa'); 
const render=require('koa-art-template');
const app=newKoa(); 
render(app,{ 
    root:path.join(__dirname,'view'), extname:'.art', debug:process.env.NODE_ENV!=='production' });
app.use( async function(ctx){ 
    await ctx.render('user'); 
});
app.listen(8080)

参考语法:http://aui.github.io/art-template/zh-cn/docs/syntax.html

koa中中间件的执行流程

koa中的中间件的执行流程和express的执行流程都是洋葱模型。


中间件的执行过程
//www.域名.com/news
app.use(async (ctx,next)=>{
    console.log('1、这是第一个中间件01');
    await next();
    console.log('5、匹配路由完成以后又会返回来执行中间件');
})
app.use(async (ctx,next)=>{
    console.log('2、这是第二个中间件02');
    await next();
    console.log('4、匹配路由完成以后又会返回来执行中间件');
})
router.get('/',async (ctx)=>{
    ctx.body="首页";
})
router.get('/news',async (ctx)=>{
    console.log('3、匹配到了news这个路由');
    ctx.body='这是一个新闻';
})
app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);

中间件的执行结果为:1、2、3、4、5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容