我一直致力于使用 Zod 和
@hono/zod-validator
在 Hono 中实现验证中间件。这是中间件的代码片段:
const validationMiddleware = (schema: ZodSchema, target: keyof ValidationTargets) => {
return createMiddleware(async (c, next) => {
await next()
zValidator(target, schema, (result, c) => {
if (!result.success) {
return c.json({
success: false,
error: {
code: 400,
message: result.error.issues[0].message,
innerError: {
timestamp: new Date(Date.now())
}
}
})
}
})
})
}
我这样使用它:
validationMiddleware(userValidation, 'json')
我面临的问题是我似乎无法获得返回值的类型安全。具体来说,当我尝试使用
c.req.valid('json')
时,TypeScript 会抛出以下错误:
TS2345: Argument of type string is not assignable to parameter of type never on the 'json' input
我很困惑为什么 TypeScript 会推断 never 而不是预期的类型。有人可以建议如何解决这个问题并确保这种情况下的类型安全吗?谢谢!
我正在尝试 hono,我自己正在研究一个类型问题,我认为问题可能出在上游。
很抱歉,这不是您正在寻找的理想答案!我决定提交帖子作为对您问题的答案和评论,因为我认为它是相关的。
我查看了代码,发现在当前版本的代码中存在令人讨厌的
// @ts-expect-error
抑制 TypeScript 错误 @hono/zod-validator
可以说是最重要的地方:
// @ts-expect-error not typed well
validator(target, async (value, c) => {
// ...
https://github.com/honojs/middleware/blob/main/packages/zod-validator/src/index.ts#L43
这使任何输入的有效性受到质疑。
我绝对讨厌当库宣传一些东西,好像它是生产就绪和类型安全的,而代码有作弊和逃生舱口,当你使用它们时会破坏类型(coughreact-hook-formcoughreact-table) .
公平地说,它是一个
v0
版本,但我认为它应该被标记为beta并且文档应该对此有一个警告。
积极的一面 --
代码本身实际上非常简单,您的项目很可能不需要 hono 尝试做的所有复杂的通用类型。为公共包编写通用库解决方案并支持钩子等额外功能是完全不同的事情。
如果您使用
@hono/zod-validator
的唯一原因是因为它为您运行 zodSchema.safeParseAsync(...)
加上 return c.json(result, 400)
那么我相信您会同意您根本不需要这个软件包。
您可以将该功能合并到您自己的中间件中,我怀疑您将能够在自己的代码库中解决类型问题。