狭义中间件的要素常见要素如下所示。
request
response
context
app.context
上ctx
上app.use()
加载context
不被app.use()
const Koa = require('koa');let app = new Koa();const middleware = async function(ctx, next) {// 中间件 拦截请求// 把所有请求不是 /page/ 开头的路径全部抛出500错误const reqPath = ctx.request.path;if( reqPath.indexOf('/page/') !== 0 ) {ctx.throw(500)}await next();}const page = async function(ctx, next) {ctx.body = `<html><head></head><body><h1>${ctx.request.path}</h1></body></html>`;}app.use(middleware);app.use(page);app.listen(3001, function(){console.log('the demo is start at port 3001');})
const Koa = require('koa');let app = new Koa();const middleware = async function(ctx, next) {ctx.response.type = 'text/plain';await next();}const page = async function(ctx, next) {ctx.body = `<html><head></head><body><h1>${ctx.path}</h1></body></html>`;}app.use(middleware);app.use(page);app.listen(3001, function(){console.log('the demo is start at port 3001');})
请求代理注入
初始化实例(应用)代理注入
const Koa = require('koa');let app = new Koa();const middleware = async function(ctx, next) {// 中间件 代理/挂载上下文// 把所有当前服务的进程PID,内存使用情况方法代理/挂载在ctx上ctx.getServerInfo = function() {function parseMem( mem = 0 ) {let memVal = mem / 1024 / 1024;memVal = memVal.toFixed(2) + 'MB';return memVal;}function getMemInfo() {let memUsage = process.memoryUsage();let rss = parseMem(memUsage.rss);let heapTotal = parseMem(memUsage.heapTotal);let heapUsed = parseMem(memUsage.heapUsed);return {pid: process.pid,rss,heapTotal,heapUsed}}return getMemInfo()};await next();}const page = async function(ctx, next) {const serverInfo = ctx.getServerInfo();ctx.body = `<html><head></head><body><p>${JSON.stringify(serverInfo)}</p></body></html>`;}app.use(middleware);app.use(page);app.listen(3001, function(){console.log('the demo is start at port 3001');})
const Koa = require('koa');let app = new Koa();const middleware = function(app) {// 中间件在初始化实例 把getServerInfo方法 挂载代理到上下文app.context.getServerInfo = function() {function parseMem( mem = 0 ) {let memVal = mem / 1024 / 1024;memVal = memVal.toFixed(2) + 'MB';return memVal;}function getMemInfo() {let memUsage = process.memoryUsage();let rss = parseMem(memUsage.rss);let heapTotal = parseMem(memUsage.heapTotal);let heapUsed = parseMem(memUsage.heapUsed);return {pid: process.pid,rss,heapTotal,heapUsed}}return getMemInfo()};}middleware(app);const page = async function(ctx, next) {const serverInfo = ctx.getServerInfo();ctx.body = `<html><head></head><body><p>${JSON.stringify(serverInfo)}</p></body></html>`;}app.use(page);app.listen(3001, function(){console.log('the demo is start at port 3001');})