validateAsync
Асинхронная версия validate. Нужна, если в схеме есть checkAsync — например, проверка «email не занят» с запросом в базу.
Сигнатура
ts
function validateAsync<S extends Schema>(schema: S, value: unknown, options?: Options): Promise<Result<Infer<S>>>Параметры
| Параметр | Тип | Описание |
|---|---|---|
schema | Schema | Схема, по которой проверяются данные |
value | unknown | Любые данные |
options | Options | { all?: boolean } — как в validate |
Возвращает
Promise с тем же результатом, что у validate: { valid, data, errors, issues }.
Как работает
- Сначала выполняются все синхронные проверки.
- Асинхронные проверки поля запускаются, только если синхронные проверки этого поля прошли — лишних запросов в базу не будет.
- Асинхронные проверки разных полей выполняются параллельно.
- Если асинхронная проверка бросила исключение,
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 });См. также
- validate
- parseAsync — асинхронная версия parse
- checkAsync