← Назад к вопросам

Как используется 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 систем.