You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fastify集成ajv-errors报错Cannot find module 'ajv/dist/compile/codegen'求助

问题根因

Fastify v3 默认内置的 AJV 版本为 v6,而你安装的ajv-errors@3.x仅支持 AJV v8,版本不匹配导致模块加载失败,且ajv-merge-patch@4.x仅兼容 AJV v6,两个插件的依赖要求冲突。


方案一:保留默认AJV v6(最小改动)

不需要修改Fastify内置的AJV实例,仅调整依赖版本即可:

  1. 卸载当前版本的ajv-errors
yarn remove ajv-errors
  1. 安装兼容AJV v6的ajv-errors v1版本
yarn add ajv-errors@1.0.1
  1. 原有Fastify初始化配置不需要修改,直接启动即可正常运行。

方案二:升级为AJV v8(使用最新版插件)

如果需要使用ajv-errors v3的新特性,可以手动为Fastify配置AJV v8实例:

  1. 先卸载原有冲突的依赖
yarn remove ajv-errors ajv-merge-patch
  1. 安装兼容AJV v8的相关依赖
yarn add ajv@8 ajv-errors@3 ajv-formats @fastify/ajv-compiler ajv-merge-patch@5
  1. 修改Fastify初始化配置,指定使用AJV v8编译器:
const fastify = require('fastify')({
  ajv: {
    customOptions: { allErrors: true, jsonPointers: true },
    plugins: [
      require('ajv-merge-patch'),
      require('ajv-errors'),
      require('ajv-formats')
    ]
  },
  // 新增指定AJV v8编译器
  schemaController: {
    compilersFactory: {
      buildValidator: require('@fastify/ajv-compiler')()
    }
  },
  requestIdHeader: 'x-service-request-id',
  requestIdLogLabel: 'requestId',
  genReqId: function (req) { return random.generate(10) }
});

自定义错误提示配置说明

依赖兼容问题解决后,你可以直接在JSON Schema中通过errorMessage字段定义自定义错误,也可以配合Fastify的setErrorHandler全局统一格式化错误输出:

fastify.setErrorHandler((error, request, reply) => {
  if (error.validation) {
    // 格式化校验错误,返回业务友好提示
    const errors = error.validation.map(err => {
      return `${err.instancePath || '参数'} ${err.message}`
    })
    return reply.status(400).send({
      code: 400,
      msg: '参数校验失败',
      errors: errors
    })
  }
  reply.status(error.statusCode || 500).send(error)
})

内容的提问来源于stack exchange,提问作者Pradip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:48:02