【问题标题】:ZOD [Error]: Schema with id 'Schema' already declaredZOD [错误]:ID 为 \'Schema\' 的模式已声明
【发布时间】:2022-11-02 07:48:23
【问题描述】:

我是 Fastify 和 Typescript 的新手。我正在添加 Zod 模式以进行验证,但出现此错误:

/app/node_modules/fastify/lib/schemas.js:32
    throw new FST_ERR_SCH_ALREADY_PRESENT(id)
          ^
FastifyError [Error]: Schema with id 'Schema' already declared!
    at Schemas.add (/app/node_modules/fastify/lib/schemas.js:32:11)
    at SchemaController.add (/app/node_modules/fastify/lib/schema-controller.js:58:30)
    at Object.addSchema (/app/node_modules/fastify/fastify.js:601:29)
    at /app/src/index.ts:23:12
    at Generator.next (<anonymous>)
    at /app/src/index.ts:8:71
    at new Promise (<anonymous>)
    at __awaiter (/app/src/index.ts:4:12)
    at main (/app/src/index.ts:32:12)
    at Object.<anonymous> (/app/src/index.ts:63:1) {
  code: 'FST_ERR_SCH_ALREADY_PRESENT',
  statusCode: 500

来自 Fastify 文档:

FST_ERR_SCH_ALREADY_PRESENT
A schema with the same $id already exists.

我不确定这个 $id 到底在哪里设置

当我只有一个模式并将其添加到 index.ts 中的 fastify 时,它正在工作:

for (const schema of userSchemas) {
   server.addSchema(schema);
}

但是添加另一个模式,会引发上述错误:

for (const schema of [...userSchemas, ...teamSchemas]) {
   server.addSchema(schema);
}

package.json 版本

 "fastify": "^4.6.0",
 "fastify-cors": "^6.1.0",
 "fastify-zod": "^1.2.0",
 "zod": "3.19.1",
 "zod-to-json-schema": "^3.18.1"

用户架构:

import { z } from 'zod';
import { buildJsonSchemas } from 'fastify-zod';
import {
  CreateUserRequest,
  UpdateUserRequest,
  UserResponse
} from '../../services/user/interface';

const createUserSchema: z.ZodSchema<CreateUserRequest> = CreateUserRequest;

const updateUserSchema: z.ZodSchema<UpdateUserRequest> = UpdateUserRequest;

const responseUserSchema: z.ZodSchema<UserResponse> = UserResponse;

export const { schemas: userSchemas, $ref } = buildJsonSchemas({
  createUserSchema,
  updateUserSchema,
  responseUserSchema
});

团队架构

import { buildJsonSchemas } from 'fastify-zod';
import { z } from 'zod';
import {
  CreateTeamRequest,
  TeamResponse,
  UpdateTeamRequest
} from '../../services/team/interface';

const createTeamSchema: z.ZodSchema<CreateTeamRequest> = CreateTeamRequest;

const updateTeamSchema: z.ZodSchema<UpdateTeamRequest> = UpdateTeamRequest;

const responseTeamSchema: z.ZodSchema<TeamResponse> = TeamResponse;

export const { schemas: teamSchemas, $ref } = buildJsonSchemas({
  createTeamSchema,
  updateTeamSchema,
  responseTeamSchema
});

看起来这是去年的一个问题,但后来得到了解决:https://github.com/fastify/fastify/issues/2914

知道我可能在这里缺少什么。

编辑: addSchema 之前的 console.log(schema) 给出:

{
  '$id': 'Schema',
  '$schema': 'http://json-schema.org/draft-07/schema#',
  type: 'object',
  properties: {
    createUserSchema: {
      type: 'object',
      properties: [Object],
      required: [Array],
      additionalProperties: false
    },
    updateUserSchema: {
      type: 'object',
      properties: [Object],
      additionalProperties: false
    },
    responseUserSchema: {
      type: 'object',
      properties: [Object],
      required: [Array],
      additionalProperties: false
    }
  },
  required: [ 'createUserSchema', 'updateUserSchema', 'responseUserSchema' ],
  additionalProperties: false
}
{
  '$id': 'Schema',
  '$schema': 'http://json-schema.org/draft-07/schema#',
  type: 'object',
  properties: {
    createTeamSchema: {
      type: 'object',
      properties: [Object],
      required: [Array],
      additionalProperties: false
    },
    updateTeamSchema: {
      type: 'object',
      properties: [Object],
      required: [Array],
      additionalProperties: false
    },
    deleteTeamSchema: {
      type: 'object',
      properties: [Object],
      required: [Array],
      additionalProperties: false
    },
    responseTeamSchema: {
      type: 'object',
      properties: [Object],
      required: [Array],
      additionalProperties: false
    }
  },
  required: [
    'createTeamSchema',
    'updateTeamSchema',
    'deleteTeamSchema',
    'responseTeamSchema'
  ],
  additionalProperties: false
}

【问题讨论】:

  • 我会在运行addSchema 之前添加console.log(schema)。它显示了什么?
  • 嗨@ManuelSpigolon 抱歉回复晚了,我在上面添加了控制台日志。
  • 如您所见,两者都有'$id': 'Schema',。你需要改变它
  • 是的,问题是我在哪里改变它?我不确定,我想我没有在任何地方明确设置它。
  • 我需要检查 zod,我不知道它是如何工作的,但它肯定是在设置那些 id

标签: typescript fastify zod


【解决方案1】:

我能够将问题缩小到fastify-zod 默认情况下,zod 模式被赋予相同的 id,即Scehma。所以explicitly adding ids 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2021-03-08
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多