Fastify使用schema验证架构.validateSync不是一个函数



从标题为Using other validation libraries的Fastify文档中,我试图让yup验证我的模式,但我一直得到schema.validateSync is not a function,我不知道为什么??

我希望该模式对于创建swagger文档仍然有效,但我想使用yup来给我所需的验证。

const yup = require("yup");
const yupOptions = {
strict: false,
abortEarly: false,
stripUnknown: true,
recursive: true,
};
async function isUsernameAvailable(fastify: any, _options: Object) {
const users = fastify.mongo.db.collection("users");
fastify.get(
"/api/v1/onboarding/isUsernameAvailable/:username",
{
schema: {
params: {
type: "object",
properties: {
username: { type: "string", maxLength: 12, minLength: 1 },
},
required: ["username"],
},
response: {
200: {
type: "object",
properties: {
available: {
type: "boolean",
description: "Returns true if username is available",
},
},
},
},
},
validatorCompiler: ({ schema, method, url, httpPart }: any) => {
return function (data: any) {
try {
const result = schema.validateSync(data, yupOptions);
return { value: result };
} catch (e) {
return { error: e };
}
};
},
},
async (request: any, _reply: any) => {
const { username } = request.params;
const foundNUsernames = await users.countDocuments(
{ username },
{ limit: 1 }
);
const available: boolean = foundNUsernames === 0;
return { available };
}
);
}
export { isUsernameAvailable };

如果我使用下面的方法,验证有效,但swagger文档没有构建

schema: {
params: yup.object({
username: yup.string().lowercase().max(12).min(1).required(),
}),
}

如果我删除validatorCompiler,那么我没有错误,swagger确实构建了,但我不能使用yup

validatorCompiler: ({ schema, method, url, httpPart }: any) => {
return function (data: any) {
try {
const result = schema.validateSync(data, yupOptions);
return { value: result };
} catch (e) {
return { error: e };
}
};
},
}

我怎样才能同时满足两者?

我为什么要用yup?我想验证电子邮件并将值转换为小写。

您可能想了解一下Zod是如何完成这个过程的。根据插件,你需要满足3个要求:

  • 类型提供程序请参阅Zod数据类型提供程序done
  • 验证器编译器请参阅Zod验证器编译器完成,但您可以将async与yup.validate一起使用
  • 序列化程序编译器(缺少(请参阅Zod JSON模式转换

因此,根据您已经完成的内容,我可以说您已经准备好了2/3,只缺少添加JSON模式转换器。对于这一步,你可能会发现这个包@sodaru/yup-json模式很有用

编辑:我已经发布了一个包挑剔类型的提供程序,所以请随意测试一下。

最新更新