1. koa 基本使用
- 安裝
npm i koa
- koa導(dǎo)出的是一個(gè)類,必須用
new
關(guān)鍵字進(jìn)行創(chuàng)建 - koa也是通過注冊(cè)中間件來完成請(qǐng)求操作的
const koa = require('koa');
// 導(dǎo)出的類,必須用new關(guān)鍵字
const app = new koa()
app.listen(8000, () => {
console.log('koa 服務(wù)器啟動(dòng)~')
})
// 使用koa這里傳遞兩個(gè)參數(shù) cxt 與next
app.use((cxt, next) => {
console.log('匹配中間')
cxt.body = '使用cxt中的body返回?cái)?shù)據(jù)'
})
2. 參數(shù)解析
- koa注冊(cè)的中間件提供了兩個(gè)參數(shù):
- ctx:上下文(Context)對(duì)象;
- koa并沒有像express一樣,將req和res分開,而是將它們作為ctx的屬性;
- ctx代表一次請(qǐng)求的上下文對(duì)象;
- ctx.request:獲取請(qǐng)求對(duì)象;
- ctx.response:獲取響應(yīng)對(duì)象;
- next:本質(zhì)上是一個(gè)dispatch,類似于之前的next;
注意點(diǎn)
cxt
上下文有兩
個(gè)請(qǐng)求對(duì)象一個(gè)是request既koa本身的對(duì)象
,還有一個(gè)node 封裝的請(qǐng)求對(duì)象:req
- 兩個(gè)響應(yīng)對(duì)象:
cxt.response 是koa封裝的響應(yīng)式對(duì)象 ,txt.res 是node封裝的響應(yīng)式對(duì)象
app.use((cxt, next) => {
/** 注意點(diǎn) 兩個(gè)請(qǐng)求對(duì)象
* @description: cxt 上下文有兩個(gè)請(qǐng)求對(duì)象一個(gè)是request既koa本身的對(duì)象,還有一個(gè)node封裝的請(qǐng)求對(duì)象:req
* @param {type}
*/
cxt.request //
cxt.req
/** 響應(yīng)對(duì)象 兩個(gè)響應(yīng)對(duì)象
* @description: cxt.response 是koa封裝的響應(yīng)式對(duì)象
* @param {type} txt.res 是node封裝的響應(yīng)式對(duì)象
* @return:
*/
cxt.body = '使用cxt中的body返回?cái)?shù)據(jù)'
})
3. 請(qǐng)求路徑區(qū)分
- koa通過創(chuàng)建的app對(duì)象,注冊(cè)中間件只能通過use方法:
- Koa并沒有提供
methods的方式來注冊(cè)中間件;
- 也沒有
提供path中間件來匹配路徑
;
- Koa并沒有提供
- 但是在開發(fā)中我們?nèi)绾螌⒙窂胶蚼ethod分離呢?
- 方式一:
根據(jù)request自己來判斷
; - 方式二:
使用第三方路由中間件
;
- 方式一:
// path
// app.use((cxt, next) => {
// if (cxt.path === '/users') {
// } else if (cxt.path === '/login') {
// cxt.body = '登錄成功'
// } else { }
// })
// method
app.use((cxt, next) => {
if (cxt.method === 'POST') {
cxt.body = '登錄成功'
} else { }
})
4. 路由
- 安裝
npm install @koa/router
const koa = require('koa');
const router = require('@koa/router')
const app = new koa()
// 1. 安裝路由使用 npm i @koa/router
const userRouter = new router({ prefix: '/users' })
//2. 注冊(cè)路由中間件
userRouter.get('/', (cxt, next) => {
cxt.body = '路由使用'
})
userRouter.get('/:id', (cxt, next) => {
const id = cxt.params.id
console.log(id);
cxt.body=id
})
// 3. 路由生效
app.use(userRouter.routes())
// allowedMethods路徑或者方法匹配配置
app.use(userRouter.allowedMethods())
app.listen(8000, () => {
console.log('koa 服務(wù)器啟動(dòng)~')
})
注意:allowedMethods用于判斷某一個(gè)method是否支持:某個(gè)請(qǐng)求或者路徑是否正確
文章來源:http://www.zghlxwxcb.cn/news/detail-603747.html
5 參數(shù)解析
- get params方式 例子
:/:id
- get query方式 例子:
?name=admin&age=18
- post json方式 例子
{name:"admin" pass:123456}
- post x-www-form-urlencoded
- post form-data
-
注意點(diǎn)
下面路由統(tǒng)一注冊(cè)為users
const userRouter = new router({ prefix: '/users' })
5.1 params 與query解析
- params參數(shù) cxt.params.id
- query參數(shù) cxt.query
userRouter.get('/:id', (cxt, next) => {
const id = cxt.params.id
cxt.body = id
})
userRouter.get('/', (cxt, next) => {
const query = cxt.query
cxt.body = query
})
5.2 body參數(shù)與urlencoded 解析
- 安裝依賴:
npm install koa-bodyparser;
- 使用與注冊(cè) koa-bodyparser的中間件;
app.use(bodyparser())
// 3. post/json body參數(shù)
// 安裝庫 npm install koa - bodyparser
// app.use(bodyparser())
// userRouter.post('/', (cxt, next) => {
// const body= cxt.request.body
// cxt.body=body
// })
// 4. urlencoded
app.use(bodyparser())
userRouter.post('/', (cxt, next) => {
const body = cxt.request.body
cxt.body = body
})
5.3 form-data參數(shù)
- 解析body中的數(shù)據(jù),需要使用multer
- 安裝依賴:
npm install --save @koa/multer multer
const upload =multer({})
app.use(upload.any())
app.use((cxt,next)=>{
console.log(cxt.req.body);
})
6 . 文件上傳
具體配置參考文章來源地址http://www.zghlxwxcb.cn/news/detail-603747.html
const koa = require('koa');
const router = require('@koa/router')
const multer = require('@koa/multer')
const app = new koa()
app.listen(8000, () => {
console.log('koa 服務(wù)器啟動(dòng)~')
})
const userRouter = new router({ prefix: '/users' })
/**
* 5. post form-data
*/
let storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, './uploads/')
},
filename: (ctx, file, cb) => {
cb(null, file.originalname);
}
});
const upload = multer({
storage
})
userRouter.post('/', upload.single('file'), (cxt, next) => {
})
// 5. form-data 解析 需要使用multer
app.use(userRouter.routes())
7. 靜態(tài)服務(wù)器
- koa并沒有內(nèi)置部署相關(guān)的功能,所以需要使用第三方庫:
- 安裝依賴
npm install koa-static
const static=require("koa-static")
const app = new koa()
app.use(static('./upload'))
8 響應(yīng)數(shù)據(jù)
- 響應(yīng)結(jié)果:body將響應(yīng)主體設(shè)置為以下之一:
-
string :
字符串?dāng)?shù)據(jù) -
Buffer
:Buffer數(shù)據(jù) -
Stream
:流數(shù)據(jù) -
Object|| Array:
對(duì)象或者數(shù)組 -
null :
不輸出任何內(nèi)容 - 如果
response.status尚未設(shè)置,Koa會(huì)自動(dòng)將狀態(tài)設(shè)置為200或204
。
-
const userRouter = new router({ prefix: '/users' })
userRouter.post('/', (cxt, next) => {
// 1.buffer 響應(yīng)數(shù)據(jù)
// cxt.body=Buffer.from('hello node')
// 2. 文件流
// const readerStream = fs.createReadStream('./upload/th5TYWK266.jpg')
// cxt.type = 'image/jpeg' // 請(qǐng)求展示圖片
// cxt.body = readerStream
// 3.響應(yīng)數(shù)組或者對(duì)象類型
cxt.body={
name:'admin',
password:123456
}
})
9 錯(cuò)誤處理
- 在做錯(cuò)誤處理統(tǒng)一封裝時(shí):
cxt上下文可以觸發(fā)一個(gè)emit事件
- 因此可以使用
app.on
進(jìn)行監(jiān)聽事件
const koa = require('koa');
const router = require('@koa/router')
const app = new koa()
app.listen(8000, () => {
console.log('koa 服務(wù)器啟動(dòng)~')
})
const userRouter = new router({ prefix: '/users' })
userRouter.get('/', (cxt, next) => {
const isAuth = false
if (isAuth) {
cxt.body = '登錄成功,返回token'
} else {
// cxt.body = {
// code: 1001,
// message: '沒有進(jìn)行授權(quán)'
// }
// 統(tǒng)一處理錯(cuò)誤
cxt.app.emit('errorEvent', 1001,cxt)
}
})
app.on('errorEvent', (code,cxt) => {
let message = ''
switch (code) {
case 1001:
message = '沒有授權(quán)'
break
default: 1002
message = '成功'
}
const body = {
code,
message
}
cxt.body=body
})
app.use(userRouter.routes())
到了這里,關(guān)于node中間件-koa框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!