带有 Fastify 的 ajv-errors 插件给出错误,因为找不到模块 'ajv/dist/compile/codegen'

ajv-errors plugin with Fastify gives error as Cannot find module 'ajv/dist/compile/codegen'

为了提供一些背景知识,我正在尝试为 AJV JSON 模式验证添加正确的模式验证错误消息格式(以对验证错误进行糖衣处理)。我正在使用 Fastify 中间件。我的目的是根据我的功能要求将默认模式错误验证消息包装到我自己的消息中,以使其对用户友好。

现在我正在使用 Fastify,我将它添加为我的插件的一部分,如下所示:

const fastify = require('fastify')({
    ajv: {
        customOptions: { allErrors: true, jsonPointers: true },
        plugins: [
            require('ajv-merge-patch'),
            require('ajv-errors'),
        ]
    },
    requestIdHeader: 'x-service-request-id',
    requestIdLogLabel: 'requestId',
    genReqId: function (req) { return random.generate(10) }
});

我正在使用

"ajv-errors": "^3.0.0" "ajv-merge-patch": "^4.1.0", (both are latest from npm)

现在我在 yarn start 中遇到这个错误:

λ yarn start
yarn run v1.22.10
warning ..\..\..\..\package.json: No license field
$ node src/server.js
node:internal/modules/cjs/loader:930
  throw err;
  ^

Error: Cannot find module 'ajv/dist/compile/codegen'
Require stack:
- service-infra\persistance\node_modules\ajv-errors\dist\index.js
- service-infra\persistance\src\server.js
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:927:15)
    at Function.Module._load (node:internal/modules/cjs/loader:772:27)
    at Module.require (node:internal/modules/cjs/loader:999:19)
    at require (node:internal/modules/cjs/helpers:93:18)
    at Object.<anonymous> (service-infra\persistance\node_modules\ajv-errors\dist\index.js:4:19)
    at Module._compile (node:internal/modules/cjs/loader:1095:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1124:10)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:816:12)
    at Module.require (node:internal/modules/cjs/loader:999:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    'service-infra\persistance\node_modules\ajv-errors\dist\index.js',
    'service-infra\persistance\src\server.js'
  ]
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

我的节点和 npm 版本是:

Node: 16.5.0, npm:7.19.1

我的 fastify 版本是:

"fastify": "^3.19.2",

在 yarn 安装过程中,这是我收到的警告消息:

Linking dependencies... warning "ajv-merge-patch@4.1.0" has unmet peer dependency "ajv@>=6.0.0". warning " > ajv-errors@3.0.0" has unmet peer dependency "ajv@^8.0.1".

我的计划是在 fastify 注册本身中编写一个验证器作为 schemaErrorFormatter 错误的糖衣。

然而,由于我无法整合 ajv 错误,我无法继续。

在这方面的任何帮助将不胜感激。

如您所见,问题出在插件版本上。

Fastify v3 在后台使用 ajv v6,因此您必须安装和使用 ajv 的插件 that support that version

所以你需要运行:

npm install ajv-errors@1 

相反,ajv-merge-patch 对最后一个版本没问题,因为 written in the docs