記事ディレクトリ
1. koaの基本的な使い方
- インストール
npm i koa
- koa がエクスポートするのはクラスであり、
new
キーワードを使用して作成する必要があります - Koa はミドルウェアを登録することでリクエスト操作も完了します
const koa = require('koa');
// 导出的类,必须用new关键字
const app = new koa()
app.listen(8000, () => {
console.log('koa 服务器启动~')
})
// 使用koa这里传递两个参数 cxt 与next
app.use((cxt, next) => {
console.log('匹配中间')
cxt.body = '使用cxt中的body返回数据'
})
2. パラメータ分析
- koa によって登録されたミドルウェアは、次の 2 つのパラメータを提供します。
- ctx: コンテキスト オブジェクト;
- Koa は、express のように req と res を分離せず、ctx の属性として使用します。
- ctx はリクエストのコンテキスト オブジェクトを表します。
- ctx.request: リクエスト オブジェクトを取得します。
- ctx.response: 応答オブジェクトを取得します。
- next: 基本的には前の次と同様のディスパッチです。
注意点
cxt
コンテキストには两
リクエスト オブジェクトがあり、1 つはrequest既koa本身的对象
、もう 1 つはです。node 封装的请求对象:req
- 2 つの応答オブジェクト:
cxt.response 是koa封装的响应式对象 ,txt.res 是node封装的响应式对象
app.use((cxt, next) => {
/** 注意点 两个请求对象
* @description: cxt 上下文有两个请求对象一个是request既koa本身的对象,还有一个node封装的请求对象:req
* @param {type}
*/
cxt.request //
cxt.req
/** 响应对象 两个响应对象
* @description: cxt.response 是koa封装的响应式对象
* @param {type} txt.res 是node封装的响应式对象
* @return:
*/
cxt.body = '使用cxt中的body返回数据'
})
3. リクエストパスの区別
- koa によって作成されたアプリ オブジェクトを通じて、ミドルウェアは use メソッドを通じてのみ登録できます。
- コアは提供しません
methods的方式来注册中间件;
- どちらでもない
提供path中间件来匹配路径
;
- コアは提供しません
- しかし、開発においてパスとメソッドをどのように分離すればよいでしょうか?
- 方法 1:
根据request自己来判断
; - 方法 2:
使用第三方路由中间件
;
- 方法 1:
// 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. 注册路由中间件
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 服务器启动~')
})
注:allowedMethods用于判断某一个method是否支持:某个请求或者路径是否正确
5 パラメータ分析
- get params メソッドの例
:/:id
- getクエリメソッドの例:
?name=admin&age=18
- JSON メソッドの例を投稿する
{name:"admin" pass:123456}
- 投稿 x-www-form-urlencoded
- 投稿フォームデータ
注意点
以下の路線が一律に登録されています。users
const userRouter = new router({
prefix: '/users' })
5.1 パラメータとクエリ解析
- params パラメータcxt.params.id
- クエリパラメータ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 本体パラメータと URL コード化された分析
- 依存関係をインストールします。
npm install koa-bodyparser;
- koa-bodyparser ミドルウェアを使用して登録します。
app.use(bodyparser())
// 3. post/json body参数
// 安装库 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 フォームデータパラメータ
- 本体内のデータを解析するには、multer を使用する必要があります。
- 依存関係をインストールします。
npm install --save @koa/multer multer
const upload =multer({
})
app.use(upload.any())
app.use((cxt,next)=>{
console.log(cxt.req.body);
})
6. ファイルのアップロード
const koa = require('koa');
const router = require('@koa/router')
const multer = require('@koa/multer')
const app = new koa()
app.listen(8000, () => {
console.log('koa 服务器启动~')
})
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. 静的サーバー
- Koa にはデプロイメント関連の機能が組み込まれていないため、サードパーティのライブラリを使用する必要があります。
- 依存関係をインストールする
npm install koa-static
const static=require("koa-static")
const app = new koa()
app.use(static('./upload'))
8 応答データ
- 応答結果: body は、応答本文を次のいずれかに設定します。
string :
文字列データBuffer
:バッファデータStream
: ストリーミングデータObject|| Array:
オブジェクトまたは配列null :
何も出力しない- もし
response.status尚未设置,Koa会自动将状态设置为200或204
。
const userRouter = new router({
prefix: '/users' })
userRouter.post('/', (cxt, next) => {
// 1.buffer 响应数据
// cxt.body=Buffer.from('hello node')
// 2. 文件流
// const readerStream = fs.createReadStream('./upload/th5TYWK266.jpg')
// cxt.type = 'image/jpeg' // 请求展示图片
// cxt.body = readerStream
// 3.响应数组或者对象类型
cxt.body={
name:'admin',
password:123456
}
})
9 エラー処理
- エラー処理の統合カプセル化を行う場合:
cxt上下文可以触发一个emit事件
app.on
したがって、イベントをリッスンするために使用できます
const koa = require('koa');
const router = require('@koa/router')
const app = new koa()
app.listen(8000, () => {
console.log('koa 服务器启动~')
})
const userRouter = new router({
prefix: '/users' })
userRouter.get('/', (cxt, next) => {
const isAuth = false
if (isAuth) {
cxt.body = '登录成功,返回token'
} else {
// cxt.body = {
// code: 1001,
// message: '没有进行授权'
// }
// 统一处理错误
cxt.app.emit('errorEvent', 1001,cxt)
}
})
app.on('errorEvent', (code,cxt) => {
let message = ''
switch (code) {
case 1001:
message = '没有授权'
break
default: 1002
message = '成功'
}
const body = {
code,
message
}
cxt.body=body
})
app.use(userRouter.routes())