Skip to content

Body parser 中间件

请求数据使用在 start/kernel.ts 文件中注册的 BodyParser 中间件解析。

中间件的配置存储在 config/bodyparser.ts 文件中。在此文件中,你可以配置用于解析 JSON 负载带文件上传的多部分表单URL 编码表单的解析器。

另请参阅:读取请求体
另请参阅:文件上传

ts
import { defineConfig } from '@adonisjs/core/bodyparser'

export const defineConfig({
  allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],

  form: {
    // HTML 表单解析设置
  },

  json: {
    // JSON 请求体解析设置
  },

  multipart: {
    // 多部分解析器设置
  },

  raw: {
    // 原始文本解析器设置
  },
})

允许的方法

你可以定义 allowedMethods 数组,bodyparser 中间件应尝试解析这些方法的请求体。默认配置了以下方法。但是,可以随意删除或添加新方法。

ts
{
  allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE']
}

将空字符串转换为 null

当输入字段没有值时,HTML 表单会在请求体中发送空字符串。HTML 表单的这种行为使得在数据库层进行数据规范化变得更加困难。

例如,如果你有一个设置为可空的数据库列 country,当用户没有选择国家时,你希望在此列中存储 null 值。

但是,对于 HTML 表单,后端接收的是空字符串,你可能会将空字符串插入数据库而不是将列保留为 null

当在配置中启用 convertEmptyStringsToNull 标志时,BodyParser 中间件可以通过将所有空字符串值转换为 null 来处理这种不一致性。

ts
{
  form: {
    // ... 其余配置
    convertEmptyStringsToNull: true
  },

  json: {
    // ... 其余配置
    convertEmptyStringsToNull: true
  },

  multipart: {
    // ... 其余配置
    convertEmptyStringsToNull: true
  }
}

JSON 解析器

JSON 解析器用于解析定义为 JSON 编码字符串的请求体,其 Content-type 头匹配预定义的 types 值之一。

ts
json: {
  encoding: 'utf-8',
  limit: '1mb',
  strict: true,
  types: [
    'application/json',
    'application/json-patch+json',
    'application/vnd.api+json',
    'application/csp-report',
  ],
  convertEmptyStringsToNull: true,
}

encoding

将请求体 Buffer 转换为字符串时使用的编码。最可能你需要使用 utf-8。但是,你可以使用 iconv-lite 包支持的任何编码。

limit

解析器应允许的请求体数据的最大限制。如果请求体超过配置的限制,将返回 413 错误。

strict

严格解析只允许 JSON 编码字符串顶层的 objectsarrays

types

应使用 JSON 解析器解析的 Content-type 头值数组。

URL 编码表单解析器

form 解析器用于解析 Content-type 头设置为 application/x-www-form-urlencoded 的 URL 编码字符串。换句话说,HTML 表单数据使用 form 解析器解析。

ts
form: {
  encoding: 'utf-8',
  limit: '1mb',
  queryString: {},
  types: ['application/x-www-form-urlencoded'],
  convertEmptyStringsToNull: true,
}

encoding

将请求体 Buffer 转换为字符串时使用的编码。最可能你需要使用 utf-8。但是,你可以使用 iconv-lite 包支持的任何编码。

limit

解析器应允许的请求体数据的最大限制。如果请求体超过配置的限制,将返回 413 错误。

queryString

URL 编码的请求体使用 qs 包解析。你可以使用 queryString 属性定义包的选项。

ts
  form: {
    queryString: {
      allowDots: true,
      allowSparse: true,
    },
  }

多部分解析器

multipart 解析器用于解析带文件上传的 HTML 表单请求。

另请参阅:文件上传

ts
multipart: {
  autoProcess: true,
  processManually: [],
  encoding: 'utf-8',
  fieldsLimit: '2mb',
  limit: '20mb',
  types: ['multipart/form-data'],
  convertEmptyStringsToNull: true,
}

autoProcess

启用 autoProcess 将把所有用户上传的文件移动到操作系统的 tmp 目录。

稍后,在控制器中,你可以验证文件并将它们移动到持久位置或云服务。

如果禁用 autoProcess 标志,你将需要手动处理流并从请求体中读取文件/字段。另请参阅:自处理多部分流

你可以定义要自动处理文件的路由数组。值必须是路由模式而不是 URL。

ts
{
  autoProcess: [
    '/uploads',
    '/post/:id'
  ]
}

processManually

processManually 数组允许你为选定的路由关闭文件的自动处理。值必须是路由模式而不是 URL。

ts
multipart: {
  autoProcess: true,
  processManually: [
    '/file_manager',
    '/projects/:id/assets'
  ],
}

encoding

将请求体 Buffer 转换为字符串时使用的编码。最可能你需要使用 utf-8。但是,你可以使用 iconv-lite 包支持的任何编码。

limit

处理所有文件时允许的最大字节数限制。你可以使用 request.file 方法定义单个文件大小限制。

fieldsLimit

处理多部分请求时允许字段(非文件)的最大字节数限制。如果字段大小超过配置的限制,将返回 413 错误。