← Назад к вопросам
Как используется guard?
1.0 Junior🔥 211 комментариев
#Архитектура и паттерны#Фреймворки и библиотеки
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Guard в Node.js Backend разработке
Guard — это паттерн защиты (Guard Clause), используемый для ранней проверки условий и выхода из функции. Это техника чистого кода, которая делает функции более читаемыми и поддерживаемыми.
Основной принцип
Guard clause проверяет условие в начале функции и сразу возвращает результат, если условие не выполнено. Это избегает глубокой вложенности if-else блоков.
// ❌ Без guard (глубокая вложенность)
function processUser(user) {
if (user) {
if (user.age >= 18) {
if (user.isActive) {
// основная логика
return user.profile;
}
}
}
return null;
}
// ✅ С guard (чистый поток)
function processUser(user) {
if (!user) return null;
if (user.age < 18) return null;
if (!user.isActive) return null;
// основная логика
return user.profile;
}
Типичные случаи использования
Валидация входных данных:
function createPost(title: string, content: string, author: User) {
if (!title || title.trim().length === 0) {
throw new Error('Title is required');
}
if (!content || content.trim().length === 0) {
throw new Error('Content is required');
}
if (!author || !author.id) {
throw new Error('Author is required');
}
// безопасно использовать данные
return { title, content, authorId: author.id };
}
Проверка доступа (Authorization):
async function updatePost(postId: string, userId: string, data: any) {
const post = await Post.findById(postId);
if (!post) throw new NotFoundError('Post not found');
if (post.authorId !== userId) throw new ForbiddenError('Not authorized');
if (post.isDeleted) throw new BadRequestError('Post is deleted');
// безопасно обновить
return post.update(data);
}
Обработка ошибок:
function findUserByEmail(email: string) {
if (!email) return null;
if (typeof email !== 'string') return null;
if (!email.includes('@')) return null;
// гарантированно валидный email
return database.users.findOne({ email });
}
Guard в типизации
В TypeScript guard'ы помогают узко типизировать:
function isString(value: unknown): value is string {
return typeof value === 'string';
}
function processValue(value: unknown) {
if (!isString(value)) return;
// TypeScript точно знает, что value — строка
console.log(value.toUpperCase());
}
Преимущества
- Читаемость — условия в начале, основная логика в конце
- Меньше вложенности — плоская структура кода
- Явные ошибки — сразу видны все проверки
- Безопасность — гарантированно валидные данные в основной логике
- Maintainability — легче добавлять новые проверки
Guard clauses — стандартный паттерн профессионального кода и обязательны при разработке надёжных backend систем.