Перейти к основному содержимому

Установка и использование

Введение

Установить библиотеку можно с помощью вашего любимого пакетного менеджера:

yarn add @rattus-orm/plugin-zod-validate

@rattus-orm/plugin-zod-validate использует события базы данных для реализации проверки типа, поэтому его можно использовать с любым Data Provider. Чтобы включить валидацию, вызовите фабрику плагина в методе use базы данных:

import { createDatabase } from '@rattus-orm/core'

const db = createDatabase({
connection: 'entities',
dataProvider: new ObjectDataProvider(),
plugins: [RattusZodValidationPlugin()]
})

db.start()

Нестрогий режим

По умолчанию валидатор работает в нестрогом режиме, то есть, при неудачной валидации данных не будет выброшено исключение:

class User extends Model {
public static entity = 'user'

@NumberField(0)
public id: number

@StringField('')
public name: string
}

db.getRepository(User).save({ id: 'asdasd', name: 'test' })
// Ошибки не будет, будет warning в консоль:
//
// Data validation failed (connection.user):
// 1. Invalid number: "asdasd" (user.id)

Строгий режим

Если вы хотите получать ошибку при несоответствии данных, вы можете включить строгий режим валидации:

db.use(RattusZodValidationPlugin({ strict: true }))

Либо, вы можете включить строгий режим для определённых моделей:

db.use(RattusZodValidationPlugin({ strict: [User.entity] }))

В этом случае, описанный выше warning станет текстом ошибки:

class User extends Model {
public static entity = 'user'

@NumberField(0)
public id: number

@StringField('')
public name: string
}

db.getRepository(User).save({ id: 'asdasd', name: 'test' })
// RattusZodValidationError: Data validation failed (connection.user):
// 1. Invalid number: "asdasd" (user.id)

Ошибка RattusZodValidationError содержит в себе оригинальные ошибки Zod, если по каким-то причинам они вам нужны. Для TypeScript вы можете использовать специальный тайп-гард:

import { isRattusZodValidationError } from '@rattus-orm/plugin-zod-validate'

try {
db.getRepository(User).save({ id: 'asdasd', name: 'test' })
} catch (e) {
if (isRattusZodValidationError(e)) {
console.log(e.originalZodErrors) // ZodError[]
}
}