我使用佐德来验证包含JSON数据的HTTP。目前,我使用的模式如下(简化,以提高可读性):
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({ payload: z.string() })
// ...
const req = requestSchema.parse(request)
const raw = JSON.parse(req.payload)
const payload = payloadSchema.parse(raw)
console.log(payload.name) // << this is what I'm interested intoZod是否提供了一种更直接的方式来深入解析包含我不知道的JSON字符串的形状?
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({ payload: z.string().json(payloadSchema) })
// ...
const req = requestSchema.parse(request)
console.log(req.payload.name) // << this is what I'm interested into发布于 2022-09-02 09:29:42
我认为如果json还没有被解析的话,你的做法是唯一的方法。奇怪的是,您会有一个作为对象的请求模式(可能是检查从调用HTTP调用的库中返回的请求对象),但有效负载尚未被解析。
下面是代码示例的runkit:https://runkit.com/robert-rendell-the/6311cbb991ef9900086d4971
一些库(Nest.js)将在HTTP请求到达时解析有效负载,因此不需要json解析步骤
我假设这就是你的请求到达时的样子:
{ payload: "{ name: '', age: 18}" }理想情况下,您希望像Nest这样的东西来执行解析,这样zod模式/ zod解析就像下面这样直接:
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({ payload: payloadSchema })
// ...
const req = requestSchema.parse({ payload: { name: '', age: 18}})
console.log(req.payload.name)发布于 2022-09-06 11:58:45
根据佐德作者的回应,载于GitHub (这里)
这里推荐的方法是在验证之前使用预处理来解析有效负载。
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({
payload: z.preprocess((val) => JSON.parse(val), payloadSchema),
})
const req = requestSchema.parse({payload:'{"name": "Beth", "age": 20}'})
// req.payload.name === Beth
// req.payload.age === 20(为清晰起见编辑的代码)
https://stackoverflow.com/questions/73580183
复制相似问题