1. 安装
2. 路由中间件
- 安装
cnpm i koa-router -D
-
const koa = require('koa'); const Router = require('koa-router'); let server = new koa(); server.listen(8080); let router = new Router(); router.get('/a', async (ctx, next) => { ctx.body = 'aaa'; }); server.use(router.routes());
2.1 嵌套路由
const koa = require('koa');
const Router = require('koa-router');
let server = new koa();
server.listen(8080);
let router = new Router();
let router1 = new Router();
let router2 = new Router();
let router3 = new Router();
// /a
router1.get('/a', async ctx => {
ctx.body = '一级路由';
});
// /a/b
router2.get('/b', async ctx => {
ctx.body = '二级路由';
});
router1.use('/a',router2.routes());
router.use(router1.routes());
server.use(router.routes());
2.2 路由参数
-
params
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8080); let router = new Router(); router.get('/news/:id1/:id2/:id3', async ctx => { console.log(ctx.params); let { id1, id2, id3 } = ctx.params; ctx.body = `新闻${id1},${id2},${id3}`; }); server.use(router.routes());
利于SEO -
urlencoded
-
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8080); let router = new Router(); router.get('/news', async ctx => { // 获取客户端传递过来的数据 console.log(ctx.query); }); server.use(router.routes());
不利于SEO
3. ctx对象
3.1 可以将一些全局的东西往 server.context
上加
-
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8080); let router = new Router(); server.context.a = 134; router.get('/news', async ctx => { console.log(ctx.a); }); server.use(router.routes());
3.2 信息类
ctx.request
和 ctx.response
是原始的 request和response 对象
- ctx.method 请求方法
- ctx.url 请求地址
- ctx.path 路径
- ctx.query get的数据
- ctx.ip 客户端的IP
- ctx.headers 请求头
- crx.state 状态码
3.3 方法类
- ctx.throw(code,msg) 报错并且退出
-
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8080); let router = new Router(); router.get('/login', async ctx => { if (!ctx.query.user) { ctx.throw(400, 'user is required'); } else { ctx.body('success'); } }); server.use(router.routes());
-
- ctx.assert(条件,code,msg)
-
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8080); let router = new Router(); router.get('/login1', async ctx => { ctx.assert(ctx.query.user, 400, 'user is required') }); server.use(router.routes());
-
- ctx.redirect() 重定向
-
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8080); let router = new Router(); router.get('/login', async ctx => { ctx.redirect('/news'); }); server.use(router.routes());
- ctx.attachment() 帮用户下载文件
4. 中间件
4.1 静态文件中间件 (koa-static)
-
安装
cnpm i koa-static -D
-
const Koa = require('koa'); const Router = require('koa-router'); const static = require('koa-static'); let server = new Koa(); server.listen(8080); // 静态文件 server.use(static('./static/', { maxAge: 86400 * 1000, //缓存时间 index: '1.html' // 默认文件 }));
缓存时间- 针对不同的文件 设置缓存时间
-
htmlconst Koa = require('koa'); const Router = require('koa-router'); const static = require('koa-static'); let server = new Koa(); server.listen(8080); // 针对不同的文件 缓存的时间也不同 let staticRouter = new Router(); // 图片文件 staticRouter.all(/\.jpg|\.gif|\.png/i, static('./static/', { maxAge: 60 * 86400 * 1000 })); // html文件 staticRouter.all(/\.html|\.htm|\.shtml/i, static('./static/', { maxAge: 20 * 86400 * 1000 })); // css文件 staticRouter.all(/\.css/i, static('./static/', { maxAge: 1 * 86400 * 1000 })); // 剩余的 staticRouter.all('', static('./static/', { maxAge: 30 * 86400 * 1000 })); server.use(staticRouter.routes());
css
图片
-
- 针对不同的文件 设置缓存时间
4.2 解析 post 数据 (koa-better-body)
-
安装
cnpm i koa-better-body -D
-
服务器
-
const Koa = require('koa'); const body = require('koa-better-body'); let server = new Koa(); server.listen(8080); server.use(body({ uploadDir: './static/' })) server.use(async ctx=>{ // 普通数据 文件数据 都在这上面 console.log(ctx.request.fields); ctx.body = 'aaa'; })
-
-
客户端
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <form action="http://localhost:8080" method="POST" enctype="multipart/form-data"> <input type="text" name="user"><br> <input type="file" name="f1"><br> <input type="submit" value="提交"> </form> </body> </html>
-
-
结果
5. cookie
-
const Koa = require('koa'); let server = new Koa(); server.listen(8080); // 秘钥 server.keys = [ 'afdsafsd', 'afdsafdasfsa', 'safdsafsdaljfkl', ]; server.use(async ctx => { // 设置 cookie ctx.cookies.set('user', 'blue', { maxAge: 14 * 86400 * 1000, //有效期 signed: true //是否签名 }); // 获取 cookie console.log(ctx.cookies.get('user', { signed: true // 验证 cookie })); })
6. session
- 安装
cnpm i koa-session -D
-
const Koa = require('koa'); const session = require('koa-session'); let server = new Koa(); server.listen(8080); // 强制签名 server.keys = [ 'afdsafdsaf', 'afdsafdsafdsafds', 'afdsalkfjdk' ]; server.use(session({ key: 'asfsda', //修改session的名字 maxAge: 20 * 60 * 1000, //session有效期 renew: true //自动续期 }, server)); server.use(async ctx => { if (!ctx.session['views']) { ctx.session['views'] = 0; } ctx.session['views']++; ctx.body = `欢迎您第${ctx.session.views}次来访`; })
7. 数据库
- 安装
cnpm i mysql co-mysql -D
-
const Koa = require('koa'); const mysql = require('mysql'); const co = require('co-mysql'); // 连接数据库 let conn = mysql.createPool({ host: 'localhost', user: 'root', password: 'root', database: 'test' }); let db = co(conn); let server = new Koa(); server.listen(8080); // 将 db 放到全局 方便使用 server.context.db = db; server.use(async ctx => { // 执行 sql 语句 let data = await ctx.db.query('SELECT * FROM sc'); ctx.body = data; })
8. 错误处理
-
服务级别错误处理
const Koa = require('koa'); let server = new Koa(); server.listen(8080); // 服务级别错误处理 server.use(async (ctx, next) => { try { await next(); } catch (e) { ctx.body = '错了'; } }); server.use(async ctx => { ctx.body = data; });
-
router 错误处理
-
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8080); let router = new Router(); router.all(/.*/, async (ctx, next) => { try { await next(); } catch (e) { ctx.body = '错了 -- router'; } }); router.get('/a', async ctx => { ctx.body = div; }); router.get('/b', async ctx => { ctx.body = 'bbb'; }); server.use(router.routes());
9. 服务端渲染
9.1 pug
- 侵入式
- 安装
cnpm i pug -D
-
const pug = require('pug'); pug.renderFile('./template/1.pug', { pretty: true, //美化 div: '动态添加', users: [{ name: 'xxx', password: '123321' },{ name: 'aaa', password: '123321' }] }, (err, data) => { if (err) { console.log('渲染失败'); } else { console.log(data); } });
9.2 ejs
- 安装
cnpm i ejs -D
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <%= name%> <ul> <%arr.forEach(item=>{%> <li> <%= item%> </li> <%})%> </ul> </body> </html>
-
const ejs = require('ejs'); ejs.renderFile('./template/1.ejs', { name: 1, arr: [1, 2, 3] }, (err, data) => { if (err) { console.log(err); } else { console.log(data); } });
- ejs中引入其他 ejs文件
-
文件 2
<header> <nav> 待引入进来的 </nav> </header>
-
引入文件2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <%- include('2.ejs') %> <ul> <%arr.forEach(item=>{%> <li> <%= item%> </li> <%})%> </ul> </body> </html>
-
服务器代码
const ejs = require('ejs'); ejs.renderFile('./template/1.ejs', { name: 1, arr: [1, 2, 3] }, (err, data) => { if (err) { console.log(err); } else { console.log(data); } });
-
结果
-
10. koa使用ejs
- 安装
cnpm i koa-ejs -D
- ejs
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <%- include('2.ejs') %> <ul> <%arr.forEach(item=>{%> <li> <%= item%> </li> <%})%> </ul> </body> </html>
- 服务器
const Koa = require('koa'); let ejs = require('koa-ejs'); const path = require('path'); let server = new Koa(); server.listen(8080); ejs(server, { root: path.resolve(__dirname, 'template'), //去哪儿找模板文件 layout: false, viewExt: 'ejs', //视图文件的扩展名 cache: false, //是否缓存 debug: false }); server.use(async (ctx) => { await ctx.render('1', { arr: [21, 232, 43] }) })
- 结果