Middleware 中间件

发布日期:2019-10-17 07:38   来源:未知   阅读:

  Middleware 称之为中间件,是 Koa 中一个非常重要的概念,利用中间件,可以很方便的处理用户的请求。由于 ThinkJS 3.0 是基于 Koa@2 版本之上构建的,所以完全兼容 Koa 里的中间件。

  中间件格式为一个高阶函数,外部的函数接收一个options参数,这样方便中间件提供一些配置信息,用来开启/关闭一些功能。执行后返回另一个函数,这个函数接收ctx,next参数,其中ctx为context的简写,是当前请求生命周期的一个对象,存储了当前请求的一些相关信息,next为调用后续的中间件,返回值是 Promise,这样可以很方便的处理后置逻辑。

  假如要实现一个打印当前请求执行时间的 middleware,可以用类似下面的方式:

  默认的中间件外层一般只是传递了options参数,有的中间件需要读取 app 相关的信息,框架在这块做了扩展,自动将 app 对象传递到中间件中。

  如果在中间件中需要用到 think 对象上的一些属性或者方法,那么可以通过app.think.xxx来获取。

  配置项为项目中要使用的中间件列表,每一项支持handle,enable,options,match等属性。

  中间件的处理函数,可以用系统内置的,也可以是引入外部的,也可以是项目里的中间件。

  有时候需要的配置项需要从远程获取,如:配置值保存在数据库中,这时候就要异步从数据库中获取,这时候可以将 options 定义为一个函数来完成:

  匹配特定的规则后才执行该中间件,支持二种方式,一种是路径匹配,一种是自定义函数匹配。如:

  // 内置的中间件不用手工 require 进来,直接通过字符串的方式引用

  meta显示一些 meta 信息,如:发送 ThinkJS 的版本号,接口的处理时间等等

  resource处理静态资源,生产环境建议关闭,直接用 webserver 处理即可。

  trace处理报错,开发环境将详细的报错信息显示处理,也可以自定义显示错误页面。

  payload处理表单提交和文件上传,类似于 koa-bodyparser 等 middleware

  有时候项目中根据一些特定需要添加中间件,那么可以放在src/middleware目录下,然后就可以直接通过字符串的方式引用了。

  有时候需要在中间件里设置一些数据,然后在后续的 Logic、Controller 中获取,此时可以通过ctx.state完成,具体请见透传数据。

  在中间件里可以通过ctx.param、ctx.post等方法来获取 query 参数或者表单提交上来的数据,但有些中间件里希望设置一些参数值、表单值以便在后续的 Logic、Controller 中获取,这时候可以通过ctx.param、ctx.post设置:

  不合适,中间件提供了options参数用来设置配置,不需要把额外的参数配置放在 config.js 中。在巴基斯坦首都伊斯兰堡,49972雷锋高手论坛坛