v1 generatorcss
v2 过渡版 generator&asynchtml
v3 async/awaitnode
koamysql
koa不带路由 所以得cnpm i koa-router -Dsql
const koa = require('koa'); const Router = require('koa-router'); let server = new koa(); server.listen(8520,()=>{console.log('success');}); //普通路由
let router = new Router(); router.get('/a', async ctx=>{ //ctx:上下文对象
ctx.body='aaa'; ctx.body+='bbb'; console.log(ctx.body); }) //把router怼给server才能生效
server.use(router.routes());
//1.嵌套路由:
/user /company /person /admin /news /sport /woman /man /car ...
const Router = require('koa-router'); let router = new Router(); router.get('/',async ctx=>{ ctx.body='用户'; }) router.use('/company',require('./company')) router.use('/admin',require('./admin')) module.exports=router.routes();
const Router = require('koa-router'); let router = new Router(); router.get('/a',async ctx=>{ ctx.body='管理员的a'; }) module.exports=router.routes();
const Router = require('koa-router'); let router = new Router(); router.get('/a',async ctx=>{ ctx.body='企业的a'; }); module.exports=router.routes();
let router = new Router(); router.use('/user',require('./routers/user')); server.use(router.routes());
运行node server.js,在浏览器输入"localhost:8520/user/admin/a",页面上则显示"管理员的a";数据库
输入"localhost:8520/user/company/a",页面上则显示"企业的a"。npm
//2.参数:
http://localhost:8520/news/12
http://localhost:8520/news/123/889
http://localhost:8520/news/123/555/146
quretion1: 用?id=xxx传参和/:id的区别 urlencoded http://aaa.com/user?a=12&b=5
params http://aaa.com/user/12/5
urlencoded params 顺序灵活 顺序是死的 能够省略 不可省略的 不利于SEO 利于SEO(由于地址是静态的)
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8520); let router = new Router(); router.get('/news/:id',async ctx=>{ console.log(ctx.params); let {id} = ctx.params ctx.body=`新闻${id}`; }); router.get('/news/:id/:id2',async ctx=>{ console.log(ctx.params); let {id,id2} = ctx.params ctx.body=`新闻${id}_${id2}`; }); router.get('/news/:id/:id2/:id3',async ctx=>{ console.log(ctx.params); let {id,id2,id3} = ctx.params ctx.body=`新闻${id}_${id2}_${id3}`; }); server.use(router.routes());
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8520,()=>{console.log('success');}); let router = new Router(); router.get('/news/',async ctx=>{ console.log(ctx.query); let {id} = ctx.query; }); server.use(router.routes());
熟悉ctx对象
server.context:至关于ctx的prototype
因此server.context适合放全局的东西
ctx.request
ctx.response
信息:
ctx.method 请求方法
ctx.url 请求地址
ctx.path 请求路径
ctx.query get数据
ctx.ip 客户端ip
ctx.headers 请求头
比较方便的报错方法: ctx.throw //报错而且退出 eg: if(!ctx.query.user || !ctx.query.pass){ ctx.throw(400,'user and password is required') }else{ ctx.body='成功'; } ctx.assert() //断言测试 ctx.assert(条件,code,msg)==if(!条件)ctx.throw eg: ctx.assert(ctx.query.user,400,'username is required')
cnpm i koa-static -d const static = requiere('koa-static') 新建static文件夹 static文件夹下面新建1.html server.js加上 server.use(static('./static')); 便可 let staticRouter = new Router(); server.use(static('./static'),{ maxage:864000*1000, //缓存时间,可下降服务器压力
index: '1.html' //默认文件
}) staticRouter.all(/(\.jpg|\.png|\.gif)/i,static('./static',{ maxage:60*86400*1000 })) //若是是jpg,png,gif文件那就缓存两个月
staticRouter.all(/(\.css)$/i,static('./static',{ maxage:1*86400*1000 })); //若是是css文件那就缓存一天
staticRouter.all(/(\.html|\.htm|\.shtml)$/i,static('./static',{ maxage:20*86400*1000 })); staticRouter.all('',static('./static',{ maxage:30*86400*1000 })); //其余文件缓存30天
server.use(staticRouter.roures());
cnpm i koa-better-body -D ctx.request.fields const Koa = require('koa'); const Router = require('koa-router'); consst body = require('koa-better-body'); let server = new Koa(); server.listen(8520); server.use(body({ //上传的文件储存在这里
uploadDir:'./static/upload' })) server.use(async ctx=>{ //文件和post数据
console.log(ctx.request.fields); ctx.body='aaa'; }); 接着form表单设置文件上传enctype='multipart/.....'
const Koa = require('koa'); const Router = require('koa-router'); let server = new Koa(); server.listen(8520); server.keys=['asdfasdf','asdfasdfa',''...]; //滚动秘钥,加密
server.use(async ctx=>{ ctx.cookies.set('user','blue',{maxAge: 14*86400*1000,signed: true //签名});
ctx.cookies.get('user',{signed:true}); })
cnpm i koa-session -D const Koa = require('koa'); const Router = require('koa-router'); const session = require('koa-session);
let server = new Koa(); server.listen(8520); //强制签名
server.keys=['asdfasdfas','asdfasdfasdf','sadfasdfasdf'...]; server.use(session({ maxAge:20*60*1000, //有效期。20分钟,时间越长安全性越低,服务器负担越大
renew:true, //session自动续期。
},server)); server.use(async ctx=>{ if(!ctx.session['view']){ ctx.session['view']=0; } ctx.session['view']++; ctx.body=`欢迎您第${ctx.session.view}次来访`; })
const Koa = require('koa'); const Router = require('koa-router);
const mysql = require('mysql'); const co = require('co-mysql'); let conn =mysql.createPool({ host:'localhost', user:'root', password:'', database:'node_sql' }); let db = co(conn); let server = new Koa(); server.listen(8520;) server.context.db=db; server.use(async (ctx,new)=>{ try{ await next(); }catch(e){ ctx.body='错了'; } }); server.use(async ctx=>{ let data = await ctx.db.query('SELECT * FROM user'); ctx.body=data; });