Используйте ajv-форматы с fastify

Играя с fastify и объектом схемы на маршрутах, я пытаюсь добавить больше проверок. быстрое использование (для проверки тела) ajv. Следуя документации и коду fastify, чтобы добавить плагин ajv, мне нужно сделать следующее:

const fastify = require('fastify')({
  ajv: {
    plugins: [
      require('ajv-merge-patch')
    ]
  }
})

Документация находится здесь

Проблема в том, что когда мы пытаемся добавить этот плагин, я получаю эту ошибку: Cannot read property 'code' of undefined" и это ошибка стека:

TypeError: Cannot read property 'code' of undefined
  at addFormats (/test-api/node_modules/ajv-formats/dist/index.js:30:26)
  at Array.formatsPlugin (/test-api/node_modules/ajv-formats/dist/index.js:15:5)
  at ValidatorCompiler (/test-api/node_modules/fastify/lib/schema-compilers.js:42:16)
  at buildCompilerFromPool (/test-api/node_modules/fastify/lib/schema-compilers.js:20:22)
  at Boot.<anonymous> (/test-api/node_modules/fastify/lib/route.js:269:39)
  at Object.onceWrapper (events.js:421:28)
  at Boot.emit (events.js:327:22)
  at /test-api/node_modules/avvio/boot.js:153:12
  at /test-api/node_modules/avvio/plugin.js:269:7
  at done (/test-api/node_modules/avvio/plugin.js:201:5)"

Я получаю эту ошибку с этим фрагментом кода:

const server: FastifyInstance<Server, IncomingMessage, ServerResponse > = fastify({
  ignoreTrailingSlash: true,
  logger: true,
  ajv: {
    plugins: [
      require('ajv-formats')
    ]
  }
})

async function run (): Promise<string> {
  server.addHook('onRoute', (options) => console.log(options))

  await server.register(helmet)
  await server.register(cors)

  return server.listen(3000, 'localhost')
}

Кто-нибудь смог использовать ajv-formats с fastify или не могли бы вы помочь мне, пожалуйста?

Заранее спасибо!


person jmanuelrosa    schedule 14.01.2021    source источник
comment
Какие версии вы используете?   -  person Manuel Spigolon    schedule 15.01.2021
comment
Я использую [email protected] прямо сейчас   -  person jmanuelrosa    schedule 15.01.2021
comment
Не могли бы вы добавить некоторые схемы? Потому что у меня есть рабочий пример с этим плагином, но я не могу воспроизвести вашу ошибку.   -  person Manuel Spigolon    schedule 15.01.2021
comment
Ошибка приходит без маршрутов и ничего, например с этим кодом я получаю ошибку: ``` async function run(): Promise‹string› { server.addHook('onRoute', (options) =› console.log (варианты)) await server.register(шлем) await server.register(cors) return server.listen(3000, 'localhost') } ``` С этим кодом я получаю сообщение об ошибке   -  person jmanuelrosa    schedule 15.01.2021


Ответы (2)


Вот рабочий пример, который вы можете настроить:

    "ajv-merge-patch": "^4.1.0",
    "fastify": "^3.9.2",
    "fastify-cors": "^5.1.0",
    "fastify-helmet": "^5.1.0",
const fastify = require('fastify')({
  ignoreTrailingSlash: true,
  logger: true,
  ajv: {
    plugins: [
      require('ajv-merge-patch')
    ]
  }
})

fastify.register(require('fastify-cors'))
fastify.register(require('fastify-helmet'))

fastify.addSchema({
  $id: 'mySchema.json#',
  type: 'object',
  properties: {
    foo: { type: 'string' },
    bar: { $ref: '#' }
  },
  additionalProperties: false
})

fastify.post('/', {
  schema: {
    body: {
      $id: 'mySchemaExtended.json#',
      $merge: {
        source: { $ref: 'mySchema.json#' },
        with: {
          properties: {
            baz: { type: 'number' }
          }
        }
      }
    }
  }
}, (req, reply) => { reply.send({ echo: req.body }) })

fastify.inject({
  method: 'POST',
  url: '/',
  payload: {
    foo: 'foo',
    bar: {
      foo: 'foo2',
      evit: 'this'
    },
    baz: 42,
    evict: 'this too'
  }
}, (err, res) => {
  console.log(res.json());
  // shows
  // { echo: { foo: 'foo', bar: { foo: 'foo2' }, baz: 42 } }
})

person Manuel Spigolon    schedule 15.01.2021
comment
как можно добавить параметры ajv в качестве плагина с fastify-cli. - person Aseer KT Miqdad; 26.06.2021

Решено! Похоже, что мои проблемы исходят из другой части моего кода. Создание новой формы проекта 0 и использование формата, кажется, работает хорошо, и мне не нужно устанавливать формат ajv, потому что у fastify есть опция формата для использования в ваших схемах!

Спасибо всем!

person jmanuelrosa    schedule 16.01.2021