Skip to content

validateAsync ​

validate 的异步版本。当 Schema 中包含 checkAsync 时需要使用,例如通过数据库查询检查“邮箱未被占用”。

签名 ​

ts
function validateAsync<S extends Schema>(schema: S, value: unknown, options?: Options): Promise<Result<Infer<S>>>

参数 ​

参数类型说明
schemaSchema用于校验数据的 Schema
valueunknown任意数据
optionsOptions{ all?: boolean } —— 与 validate 相同

返回值 ​

一个 Promise,结果与 validate 相同:{ valid, data, errors, issues }。

工作方式 ​

  1. 先执行所有同步检查。
  2. 字段的异步检查只有在该字段的同步检查通过后才会执行 —— 不会产生多余的数据库查询。
  3. 不同字段的异步检查并行执行。
  4. 如果异步检查抛出异常,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 });

另请参阅 ​