Node KOA框架入門

KOA:

v1 generatorcss

v2 過渡版 generator&asynchtml

v3 async/awaitnode

 

koamysql

koa不帶路由  所以得cnpm i koa-router -Dsql

 

路由:1.嵌套、2.參數

0.普通路由

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.嵌套路由

//1.嵌套路由:
/user /company /person /admin /news /sport /woman /man /car ...

  (1).項目目錄

  (2).index.js

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

  (3).admin.js和company.js

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

  (4).server.js

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.參數

//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(由於地址是靜態的) 

  (1).項目目錄

  (2).參數params

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

  (3).參數urlencoded

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對象

熟悉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')

 

koa-static

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

 

koa-beffer-body

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/.....'

 

cookie(koa裏cookie是自帶的)

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

 

session

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}次來訪`; })

 

數據庫  co-mysql //koa-mysql已經廢了

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; });
相關文章
相關標籤/搜索