一、安装 koa
npm install koa --save
二、简单使用
const koa = require('koa'); //注意使用koa需要new,跟express有点不同 let app = new koa(); app.listen(8888); //use()方法将中间件加入应用中 app.use(async function (ctx, next) { //ctx.res 原生res //ctx.req 原生req //ctx.request 被koa包装过的req对象 //ctx.response 被koa包装过的res对象 ctx.response.body = 'ok'; }); //发生错误时触发 app.on('error', function (err) { console.log(err); });
三、级联中间件的概念
const koa = require('koa'); let app = new koa(); app.listen(8888); app.use(async function (ctx, next) { console.log('1'); await next(); console.log('2'); }); app.use(async function (ctx, next) { console.log('3'); await next(); console.log('4'); }); app.use(async function (ctx, next) { console.log('5'); });
上述代码最终会打印出 1 3 5 4 2,koa中间件里的 await next() 之前的代码会一级一级向下执行,直到没有更多中间件执行,然后再像栈一样的执行 await next() 之后的代码。
四、获取get请求参数
const koa = require('koa'); const router = require('koa-router'); let app = new koa(); let route = new router(); app.listen(8888); route.get('/:id', function (ctx, next) { //获取请求方法 console.log(ctx.method); //获取请求URL console.log(ctx.url); //获取请求路径 console.log(ctx.path); //获取请求查询字符串对象 console.log(ctx.query); //获取请求查询字符串 console.log(ctx.querystring); //获取路由参数 console.log(ctx.params); //获取请求头对象 console.log(ctx.headers); }); app.use(route.routes());
五、获取post表单数据和文件上传
安装 koa-better-body 用于解析
npm install koa-better-body --save npm install koa-convert --save
注意使用 koa-better-body 需要用 koa-convert 转换一下。
const fs = require('fs'); const path = require('path'); const koa = require('koa'); const router = require('koa-router'); const betterBody = require('koa-better-body'); const convert = require('koa-convert'); let app = new koa(); let route = new router(); app.listen(8888); //使用koa-better-body需要用koa-convert转一下 app.use(convert(betterBody({ //指定上传的目录 uploadDir: path.join(__dirname, 'uploads'), //是否保留扩展名 keepExtensions: true, //设置上传文件大小最大限制,默认2M maxFileSize: 1024 * 1024 * 1024 }))); route.get('/', function (ctx, next) { ctx.response.set('Content-Type', 'text/html;charset=utf-8'); ctx.body = fs.readFileSync('./index.html'); }); route.post('/post', function (ctx, next) { //post表单数据 console.log(ctx.request.fields); //上传文件的详细信息 console.log(ctx.request.files); }); app.use(route.routes());
index.html的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表单</title> </head> <body> <form action="http://localhost:8888/post" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="name"><br> 密码:<input type="password" name="pwd"><br> 头像:<input type="file" name="head"><br> 信息1:<input type="file" name="info"><br> 信息2:<input type="file" name="info"><br> <input type="submit" name="提交"> </form> </body> </html>
六、路由中间件 koa-router
npm install koa-router --save
路由是可以设置多级的,可以嵌套。方便我们自由拆分。
const koa = require('koa'); const router = require('koa-router'); let app = new koa(); app.listen(8888); let users = new router(); let order = new router(); users.get('/', function (ctx) { ctx.body = '用户页面'; }); users.get('/add', function (ctx) { ctx.body = '用户添加页面'; }); order.get('/', function (ctx) { ctx.body = '订单页面'; }); order.get('/add', function (ctx) { ctx.body = '订单添加页面'; }); let route = new router(); route.use('/users', users.routes()); route.use('/order', order.routes()); app.use(route.routes());
七、cookie的设置与读取
koa中可以直接通过 ctx.cookies.set() 或 ctx.cookies.get() 进行设置和获取cookie
const koa = require('koa'); const router = require('koa-router'); let app = new koa(); app.listen(8888); //设置cookie签名加密时,需要配置密钥 app.keys = [ '2dsfjo3rt3pt934rjh2' ]; let route = new router(); route.get('/', function (ctx, next) { //参数一表示,cookie名称 //参数二表示,cookie的值 //参数三表示,cookie的配置选项 ctx.cookies.set('test', 'test', { //cookie所在的域名 domain: 'localhost', //cookie所在的路径 path: '/', //有效时间,单位毫秒 maxAge: 3600 * 1000, //失效时间 expires: new Date(Date.now() + 3600 * 1000), //是否只能在http中获取 httpOnly: true, //是否允许重写 overwrite: true }); //设置cookie是否签名加密,如果设置签名加密,需配置app.keys ctx.cookies.set('name', 'xiaoxu', {signed: true}); //获取cookie console.log(ctx.cookies.get('test')); console.log(ctx.cookies.get('name')); }); app.use(route.routes());
八、session的使用
安装 koa-session 中间件
npm install koa-session --save
koa-session默认会话是基于cookie实现的,当然会话信息也可以保存到其它地方。
const koa = require('koa'); const router = require('koa-router'); const session = require('koa-session'); let app = new koa(); app.listen(8888); //设置签名加密的密钥 app.keys = [ 'rj345jptjgadsfjeasltrg' ]; let route = new router(); //使用koa-session中间件 app.use(session({ //cookie的名称 key: 'session', //有效时间 maxAge: 3600 * 1000, //是否自动提交头信息 autoCommit: true, //是否充许重写 overwrite: true, //是否只能http获取 httpOnly: true, //是否签名加密 signed: true }, app)); route.get('/', function (ctx, next) { if (ctx.session.count) { ++ctx.session.count; } else { ctx.session.count = 1; } ctx.body = `您是第 ${ctx.session.count} 次访问`; }); app.use(route.routes());
九、模板引擎ejs的使用
npm install koa-ejs --save
通过ejs模板引擎,我们可以很方便的渲染页面。
const path = require('path'); const koa = require('koa'); const router = require('koa-router'); const ejs = require('koa-ejs'); let app = new koa(); app.listen(8888); let route = new router(); //模板引擎配置 ejs(app, { //模板目录 root: path.join(__dirname, 'views'), //布局文件 layout: false, //模板扩展名 viewExt: 'html', //是否开启缓存 cache: false, //是否开启调试信息 debug: true }); route.get('/', async function (ctx, next) { await ctx.render('index', { name: 'xiaoxu', age: 24 }); }); app.use(route.routes());
十、静态资源中间件
我们使用 koa-static-cache 这个中间件。
npm install koa-static-cache --save
使用 koa-static-cache 帮我们处理静态资源
const path = require('path'); const koa = require('koa'); const static = require('koa-static-cache'); let app = new koa(); app.listen(8888); //使用中间件,并配置静态资源目录 app.use(static(path.join(__dirname, 'public'), { //是否压缩文件 gzip: true, //缓存有效时间 maxAge: 60 }));