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实例,仅调整依赖版本即可:
- 卸载当前版本的ajv-errors
yarn remove ajv-errors
- 安装兼容AJV v6的ajv-errors v1版本
yarn add ajv-errors@1.0.1
- 原有Fastify初始化配置不需要修改,直接启动即可正常运行。
方案二:升级为AJV v8(使用最新版插件)
如果需要使用ajv-errors v3的新特性,可以手动为Fastify配置AJV v8实例:
- 先卸载原有冲突的依赖
yarn remove ajv-errors ajv-merge-patch
- 安装兼容AJV v8的相关依赖
yarn add ajv@8 ajv-errors@3 ajv-formats @fastify/ajv-compiler ajv-merge-patch@5
- 修改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
相关产品推荐
相关产品推荐

