ノードミドルウェア-koaフレームワーク

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: 基本的には前の次と同様のディスパッチです。

注意点

  1. cxtコンテキストにはリクエスト オブジェクトがあり、1 つはrequest既koa本身的对象、もう 1 つはです。node 封装的请求对象:req
  2. 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: 使用第三方路由中间件;
// 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 パラメータ分析

  1. get params メソッドの例:/:id
  2. getクエリメソッドの例:?name=admin&age=18
  3. JSON メソッドの例を投稿する{name:"admin" pass:123456}
  4. 投稿 x-www-form-urlencoded
  5. 投稿フォームデータ
  • 注意点以下の路線が一律に登録されています。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())

おすすめ

転載: blog.csdn.net/weixin_46104934/article/details/131875165