中间件 Middlewares

Strapi 为其中间件配置提供了单一入口点文件。

不同类型的中间件

在 Strapi 中,2 个中间件概念共存:

  • 全局中间件 配置并启用为整个 Strapi 服务器应用程序的全局中间件。本文档描述了如何配置全局中间件。
    Strapi 还提供了实现您自己的自定义中间件的能力(请参阅 中间件自定义文档)。
  • 路由中间件 的范围更有限,并在路由级别配置和用作中间件。它们在 路由中间件文档 中进行了描述。

./config/middlewares.js 文件用于定义 Strapi 服务器应应用的所有全局中间件。

仅应用 ./config/middlewares.js 中存在的中间件。加载中间件按特定的 加载顺序 进行,每个中间件都有一些 命名约定可选配置

Strapi 使用内置的内部中间件预填充 ./config/middlewares.js 文件,这些中间件都有自己的 配置选项

加载顺序

./config/middlewares.js 文件导出一个数组,其中顺序很重要并控制中间件堆栈的执行顺序:

js
./config/middlewares.js
js
module.exports = [
  // 该数组已预先填充内部、内置中间件,前缀为 `strapi::`
  'strapi::logger',
  'strapi::errors',
  'strapi::security',
  'strapi::cors',

  // 不需要任何配置的自定义中间件
  'global::my-custom-node-module',

  // 自定义名称以查找包或路径
  {
    name: 'my-custom-node-module',
    config: {
      foo: 'bar',
    },
  },

  // 自定义解析以查找包或路径
  {
    resolve: '../some-dir/custom-middleware',
    config: {
      foo: 'bar',
    },
  },

  // 内部中间件的自定义配置
  {
    name: 'strapi::poweredBy',
    config: {
      poweredBy: 'Some awesome company',
    },
  },

  // 其余内部和内置中间件
  'strapi::query',
  'strapi::body',
  'strapi::session',
  'strapi::favicon',
  'strapi::public',
]

如果您不确定将中间件放在堆栈中的什么位置,请将其添加到列表末尾。

命名约定

全局中间件可以根据其来源分为不同类型,这定义了以下命名约定:

中间件类型来源命名约定
内部内置中间件(即包含在 Strapi 中),自动加载strapi::middleware-name
应用程序级别./src/middlewares 文件夹加载global::middleware-name
API 级别./src/api/[api-name]/middlewares 文件夹加载api::api-name.middleware-name
插件从插件接口的 middlewares 属性中的 strapi-server.js 导出plugin::plugin-name.middleware-name
外部可以是:
  • 使用 npm 安装的节点模块
  • 或本地中间件(即本地创建并在 ./config/middlewares.js 中配置的自定义中间件。)
-

由于它们是直接从配置文件中配置和解析的,因此它们没有命名约定。

可选配置

中间件可以具有具有以下参数的可选配置:

参数描述类型
config用于定义或覆盖中间件配置Object
resolve中间件文件夹的路径(对外部中间件有用)String

内部中间件配置参考

Strapi 的核心包括以下内部中间件,主要用于性能、安全和错误处理:

MiddlewareAdded by DefaultRequired
bodyYesYes
compressionNoNo
corsYesYes
errorsYesYes
faviconYesYes
ipNoNo
loggerYesNo
poweredByYesNo
queryYesYes
response-timeNoNo
responsesYesYes
publicYesYes
securityYesYes
sessionYesNo

body

body 中间件基于 koa-body。它接受以下选项:

选项说明类型默认
multipart解析多部分主体Booleantrue
patchKoa将请求主体修补到 Koa 的 ctx.requestBooleantrue
jsonLimitJSON 主体的字节(如果是整数)限制StringInteger1mb
formLimit表单主体的字节(如果是整数)限制StringInteger56kb
textLimit文本主体的字节(如果是整数)限制StringInteger56kb
encoding设置传入表单字段的编码Stringutf-8
formidable传递给 formidable 多部分解析器的选项请参阅 node-formidable 文档Objectundefined

有关 koa-body 可用选项的完整列表,请查看 koa-body 文档

示例:body 中间件的自定义配置

js
./config/middlewares.js
js
module.exports = [
  // ...
  {
    name: 'strapi::body',
    config: {
      jsonLimit: '3mb',
      formLimit: '10mb',
      textLimit: '256kb',
      encoding: 'gbk',
    },
  },
  // ...
]

poweredBy

poweredBy 中间件向响应标头添加 X-Powered-By 参数。它接受以下选项:

选项说明类型默认值
poweredByX-Powered-By 标头的值String'Strapi <strapi.io>'

详细信息示例:poweredBy 中间件的自定义配置

js
./config/middlewares.js
js
module.exports = [
  // ...
  {
    name: 'strapi::poweredBy',
    config: {
      poweredBy: 'Some Awesome Company <example.com>'
    },
  },
  // ...
]