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; });