使用 trim 固定模式验证

fastify schema validation with trim

我写了一个schema如下

input: {
            type: "string",
            allOf: [
                {
                  transform: [
                    "trim"
                  ]
                },
                {
                  minLength: 1
                }
            ],
            transform: ["trim"],
            trim: true,
            description: "Input",
            minLength: 1,
            maxLength: 3
        }

我想完成两件事 - 我想 trim 输入并且我想验证 trimmed 输入的 minLength = 1。 我尝试了为此遇到的所有不同配置,但到目前为止,其中 none 个都有效。我使用的是 fastify 版本 3.0.0,我相信它使用 ajv 验证器来进行转换和验证。验证部分正在运行,但是 trim 没有发生。

transform 不是标准的 json-schema 功能。

因此您需要配置 ajv 才能使其正常工作:

注意 allOf 数组是顺序执行的,因此如果您将 min/max 关键字移动到根文档,空格将被计算!


const Fastify = require('fastify')
const fastify = Fastify({
  logger: true,
  ajv: {
    plugins: [
      [require('ajv-keywords'), ['transform']]
    ]
  }
})

fastify.post('/', {
  handler: async (req) => { return req.body },
  schema: {
    body: {
      type: 'object',
      properties: {
        input: {
          type: 'string',
          allOf: [
            { transform: ['trim'] },
            { minLength: 1 },
            { maxLength: 3 }
          ]
        }
      }
    }
  }
})

fastify.inject({
  method: 'POST',
  url: '/',
  payload: {
    input: '   foo   '
  }
}, (_, res) => {
  console.log(res.payload);
})

使用下面的 cmd

安装 ajv-keywords
npm i ajv-keywords

在代码中导入'ajvKeywords'如下

import ajvKeywords from 'ajv-keywords'

将 ajv 实例传递给 ajvKeyword

const ajv = new Ajv({
    useDefaults: true,
  })


 ajvKeywords(ajv, ['transform'])

并在架构中使用如下

schema: {
    body: {
      type: 'object',
      properties: {
        input: {
          type: 'string',
          transform: ['trim'],
          allOf: [
            { transform: ['trim'] },
            { minLength: 1 },
            { maxLength: 3 }
          ]
       }
        }
      }
    }
  }