Skip to content

validateAsync ​

Асинхронная версия validate. Нужна, если в схеме есть checkAsync — например, проверка «email не занят» с запросом в базу.

Сигнатура ​

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

Параметры ​

ПараметрТипОписание
schemaSchemaСхема, по которой проверяются данные
valueunknownЛюбые данные
optionsOptions{ all?: boolean } — как в validate

Возвращает ​

Promise с тем же результатом, что у validate: { valid, data, errors, issues }.

Как работает ​

  1. Сначала выполняются все синхронные проверки.
  2. Асинхронные проверки поля запускаются, только если синхронные проверки этого поля прошли — лишних запросов в базу не будет.
  3. Асинхронные проверки разных полей выполняются параллельно.
  4. Если асинхронная проверка бросила исключение, validateAsync тоже отклоняется с ним.

Для схем без асинхронных проверок validateAsync тоже работает, просто возвращает Promise.

Если заранее неизвестно, есть ли в схеме асинхронные проверки, используйте validateAny(schema, value, options): она возвращает результат сразу, а Promise — только когда асинхронные проверки есть. Каждая проверка вызывается один раз.

Пример ​

Регистрация ​

ts
const Signup = object({
  email: pipe(string(), email(), checkAsync(async (v) => !(await db.users.exists({ email: v })), 'Email занят')),
  password: pipe(string(), minLength(8)),
});

const result = await validateAsync(Signup, req.body);

if (!result.valid) return res.status(422).json({ errors: result.errors });

См. также ​