validateAsync
validate 的异步版本。当 Schema 中包含 checkAsync 时需要使用,例如通过数据库查询检查“邮箱未被占用”。
签名
ts
function validateAsync<S extends Schema>(schema: S, value: unknown, options?: Options): Promise<Result<Infer<S>>>参数
| 参数 | 类型 | 说明 |
|---|---|---|
schema | Schema | 用于校验数据的 Schema |
value | unknown | 任意数据 |
options | Options | { all?: boolean } —— 与 validate 相同 |
返回值
一个 Promise,结果与 validate 相同:{ valid, data, errors, issues }。
工作方式
- 先执行所有同步检查。
- 字段的异步检查只有在该字段的同步检查通过后才会执行 —— 不会产生多余的数据库查询。
- 不同字段的异步检查并行执行。
- 如果异步检查抛出异常,
validateAsync也会以该异常拒绝。
没有异步检查的 Schema 同样可以使用 validateAsync,只是返回一个 Promise。
如果事先不知道 Schema 中是否有异步检查,请使用 validateAny(schema, value, options):它会直接返回结果,只有存在异步检查时才返回 Promise。每个检查只调用一次。
示例
注册
ts
const Signup = object({
email: pipe(string(), email(), checkAsync(async (v) => !(await db.users.exists({ email: v })), '该邮箱已被占用')),
password: pipe(string(), minLength(8)),
});
const result = await validateAsync(Signup, req.body);
if (!result.valid) return res.status(422).json({ errors: result.errors });另请参阅
- validate
- parseAsync:parse 的异步版本
- checkAsync