KOA (破坏式框架)
KOA v1 支持generator
KOA v2 过度版本,支持generator/async
KOA v3 支持async,(未发布,2018-4-13)
KOA 升级问题,部分中间件不随KOA升级
KOA 自带对cookie的控制,不带对session的控制
KOA 强依赖router
//koa安装
//koa(主文件) koa-static(控制静态文件,被koa-static-cache代替) koa-better-body(控制post数据) koa-convert(控制不随koa升级的中间件) koa-router(路由)
//koa-mysql(未更新,被mysql-pro代替) koa-pug koa-ejs
cnpm i koa koa-static koa-better-body koa-convert koa-router -D
//koa使用--创建服务器(koa)与使用路由(koa-router)
const koa = require('koa');
const router = require('koa-router');
let server = new koa();
server.listen(8087);
//KOA 强依赖router 必须使用路由
let r1 = router();//koa-router
server.use(r1.routes());//调用路由必须使用routes()函数
//r1路由有get\post\put\delete等等等等函数,koa3的路由函数中回调函数为async函数,koa1为function函数
r1.get('/a',async (ctx,next)=>{
//ctx中有node原生属性跟koa封装的属性
//ctx.req node原生的
//ctx.request koa封装的
//ctx.res
//ctx.response
console.log(ctx);
ctx.response.body={a:12,b:33};//使用响应体,直接向浏览器返回内容
ctx.response.set('header','aaaaa');//设置特定的响应头
ctx.response.status=403;//设置响应码
console.log(ctx.request.headers);//获取求情头request里有method,url,header,query等属性
});
//koa使用--静态文件(koa-static),(koa-static-cache)
//koa-static缺点,会将文件原样发送,而不是进行压缩,所以使用koa-static-cache代替,koa-static-cache会进行压缩与缓存
const koa = require('koa');
//const static = require('koa-static');
const static = require('koa-static-cache');
const pathlib = require('path');//用来将路径改为绝对路径,方便日后更新路径
let server = new koa();
server.listen(8087);
//pathlib.resolve(),绝对路径,参数可以有多个以逗号分隔,以表示多层文件夹,支持./,../。例:pathlib.resolve('aa','cc');指向当前文件所在的绝对路径盘符/aa/cc;
server.use(static(pathlib.resolve('www')));//访问localhost:8087/1.html;就会到绝对路径下的www文件夹下去找1.html
//koa使用--获取get数据
const koa = require('koa');
const router = require('koa-router')
let server = new koa();
server.listen(8087);
let r1 = router();
server.use(r1.routes());
r1.get('/api/:name',async (ctx)=>{
console.log(ctx.params);//localhost:8087/api/aa;路由参数获取,此处获取{name:'aa'}
console.log(ctx.request.query);//localhost:8087/api/aa?b=555;get方法的参数获取url?后面的数据{b:'555'}
ctx.response.body='aaa';//返回响应
})
//koa使用--获取post数据('koa-better-body')--使用convert更新中间件
const koa = require('koa');
const betterBody = require('koa-better-body');
const convert = require('koa-convert');
const pathlib = require('path');
let server = new koa();
server.listen(8087);
//使用convert 来解决koa升级带来的中间件版本太旧问题
server.use(convert(betterBody({
uploadDir:pathlib.resolve('./upload'),//指定文件上传后存储的位置,betterBody默认会上传到系统的C盘临时文件存放处
keepExtendsions:true,//保持文件扩展名
})));
server.use(async ctx=>{
console.log(ctx.request.fields);//获取普通数据+部分文件数据信息
console.log(ctx.request.files);//获取文件数据,form表单需要开启<form enctype='multipart/form-data'>;否则会文件上传失败;
})
//koa使用--进行cookie与session的用法
//cookie
const koa = require('koa');
let server = new koa();
server.listen(8087);
server.use(async (ctx)=>{
console.log(ctx.cookies.get('a'));//获取前台发送的cookie a=12
//向前台发送的cookie b=5
ctx.cookies.set('b',5,{
maxAge:86400*1000,//有效时长一天
// domain:'localhost', // 写cookie所在的域名
// path:'/', // 写cookie所在的路径
// maxAge: 2*60*60*1000, // cookie有效时长
// expires:new Date('2018-02-08'), // cookie失效时间
// httpOnly:false, // 是否只用于http请求中获取
// overwrite:false // 是否允许重写
});
ctx.response.body='a'
})
//session
const koa = require('koa');
const koaSeeion = require('koa-session');
let server = new koa();
server.listen(8087);
server.keys=['key1','key2','key3'];//滚动密钥,koa强制使用秘钥,增强安全性,通常将这个key放到一个单独的文件中使用模块抛出,此处引入模块以保证安全性
server.use(koaSeeion({},server));//koa-session使用需要将server实例发给koaSession,哎,这就很烦。
server.use(async (ctx)=>{
if(ctx.session['count']){
ctx.session['count']++;//设置session中的count,发送给浏览器
}
console.log(ctx.session['count']);//获取session中的count
});
//koa使用pug,语法同4-10笔记pug
const koa = require('koa');
const Pug = require('koa-pug');
const pathlib = require('path');
let server = new koa();
server.listen(8087);
let pug = new Pug({//舒适化pug
viewPath:pathlib.resolve('template/pug'),//存放文件的路径
app:server,//使用服务器
});
server.use(async ctx=>{
await ctx.render('1',{a:12})//模板文件以及模板使用数据;
})
//koa使用ejs,语法同4-10笔记ejs
const koa = require('koa');
const Ejs = require('koa-ejs');
const pathlib = require('path');
let server = new koa();
server.listen(8087);
Ejs(server,{
root:pathlib.resolve('template/ejs'),
layout:false,
viewExt:'ejs'//模板文件后缀名
})
server.use(async ctx=>{
await ctx.render('1',{a:12,name:'blue'})//模板文件以及模板使用数据;
})
//koa使用数据库(koa-mysql,见4-14)
扩展
form表单,文件上传
form表单上传文件数据时需要开启<form enctype='multipart/form-data'>;否则会文件上传失败
网友评论