koa2ミドルウェア
koa2は、ミドルウェアによってasync await
実装され、実行順序がミドルウェア「オニオンリング」モデルです。
ミドルウェアミドルウェア間の通話は、次のリンク機能によりnext()
、次のミドルウェアの制御を引き渡すだろう、ミドルウェアは、次まで実行されていないnext()
ポスト、我々は道路に沿って折り畳まれる、に切り替える前に、右のコントロールを回しますミドルウェア。
図:
koa2ミドルウェア例
app.js:
const Koa = require('koa');
const app = new Koa();
// logger
app.use(async (ctx, next) => {
console.log('第一层 - 开始')
await next();
const rt = ctx.response.get('X-Response-Time');
console.log(`${ctx.method} ----------- ${ctx.url} ----------- ${rt}`);
console.log('第一层 - 结束')
});
// x-response-time
app.use(async (ctx, next) => {
console.log('第二层 - 开始')
const start = Date.now();
await next();
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`);
console.log('第二层 - 结束')
});
// response
app.use(async ctx => {
console.log('第三层 - 开始')
ctx.body = 'Hello World';
console.log('第三层 - 结束')
});
app.listen(3000);
app.jsを実行した後に、アクセスするためのブラウザHTTPを:// localhostを:3000 /テキスト、コンソール出力:
第一层 - 开始
第二层 - 开始
第三层 - 开始
第三层 - 结束
第二层 - 结束
打印第一次执行的结果: GET -------- /text ------ 4ms
第一层 - 结束
koa2ミドルウェアアプリケーション
ここでは、ログイン認証ミドルウェアは次のとおりです。
loginCheck.js:
module.exports = async (ctx, next) => {
if (ctx.session.username) {
// 登陆成功,需执行 await next(),以继续执行下一步
await next()
return
}
// 登陆失败,禁止继续执行,所以不需要执行 next()
ctx.body = {
code: -1,
msg: '登陆失败'
}
}
削除操作でloginCheck.jsを使用します。
router.post('/delete', loginCheck, async (ctx, next) => {
const author = ctx.session.username
const id = ctx.query.id
// handleDelete() 是一个处理删除的方法,返回一个 promise
const result = await handleDelete(id, author)
if (result) {
ctx.body = {
code: 0,
msg: '删除成功'
}
} else {
ctx.body = {
code: -1,
msg: '删除失败'
}
}
})
ミドルウェアを表現
違いはkoa2ミドルウェアは、ミドルウェアExpressは通常、ミドルウェア続く書き込み応答に応じて、1つのずつ順番に実行したことです
主な特長:
- ミドルウェアを登録するために使用app.use
- ミドルウェアを引き起こしかを決定するために、パスおよび方法によれば、HTTP要求が発生しました
- 次の次のトリガミドルウェア上でミドルウェアを通過します次のメカニズムを達成
例としては、ミドルウェアを発現します
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log('第一层 - 开始')
setTimeout(() => {
next()
}, 0)
console.log('第一层 - 结束')
})
app.use((req, res, next) => {
console.log('第二层 - 开始')
setTimeout(() => {
next()
}, 0)
console.log('第二层 - 结束')
})
app.use('/api', (req, res, next) => {
console.log('第三层 - 开始')
res.json({
code: 0
})
console.log('第三层 - 结束')
})
app.listen(3000, () => {
console.log('server is running on port 3000')
})
app.jsを実行した後に、アクセスするためのブラウザHTTP:// localhostを:3000 / API、コンソール出力を:
第一层 - 开始
第一层 - 结束
第二层 - 开始
第二层 - 结束
第三层 - 开始
第三层 - 结束
()次の上記中間体の各々は非同期に実行されるので、結果は、出力線の線を印刷しています。
あなたは)(上記次をキャンセル非同期に実行されている場合は、次のように直接:
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log('第一层 - 开始')
next()
console.log('第一层 - 结束')
})
app.use((req, res, next) => {
console.log('第二层 - 开始')
next()
console.log('第二层 - 结束')
})
app.use('/api', (req, res, next) => {
console.log('第三层 - 开始')
res.json({
code: 0
})
console.log('第三层 - 结束')
})
app.listen(3000, () => {
console.log('server is running on port 3000')
})
app.jsを実行した後に、アクセスするためのブラウザHTTP:// localhostを:3000 / API、コンソール出力を:
第一层 - 开始
第二层 - 开始
第三层 - 开始
第三层 - 结束
第二层 - 结束
第一层 - 结束
可視、エクスプレスミドルウェアは、「オニオンリング」モデルを形成するが、一般的に最後の一般的なミドルウェア、他のミドルウェアで応答を発現するため、明示的にそうではないであろう、そうすることができ、最終的な未満影響コードの後に()の次の結果。
ミドルウェア・アプリケーションを表現
ここでは、ログイン認証ミドルウェアは次のとおりです。
loginCheck.js:
module.exports = (req, res, next) => {
if (req.session.username) {
// 登陆成功,需执行 next(),以继续执行下一步
next()
return
}
// 登陆失败,禁止继续执行,所以不需要执行 next()
ctx.body = {
code: -1,
msg: '登陆失败'
}
}
削除操作でloginCheck.jsを使用します。
router.post('/delete', loginCheck, (req, res, next) => {
const author = req.session.username
const id = req.query.id
// handleDelete() 是一个处理删除的方法,返回一个 promise
const result = handleDelete(id, author)
return result.then(val => {
if (val) {
ctx.body = {
code: 0,
msg: '删除成功'
}
} else {
ctx.body = {
code: -1,
msg: '删除失败'
}
}
})
})