> Как реализовать функцию auth через колбек в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript

> Пример ответа

Короткий ответ

Реализовать функцию auth через колбек в JavaScript - значит создать асинхронную функцию, которая принимает учётные данные и функцию обратного вызова. После проверки (например, запроса к серверу) вызывается колбек с результатом: первым аргументом - ошибка (если есть), вторым - данные пользователя или токен. Это классический паттерн Node.js (error-first callback), который позволяет обработать успех или неудачу аутентификации без возврата значения напрямую.

Подробное объяснение

Функция auth через колбек - это асинхронный паттерн, где результат операции (успех или ошибка) передаётся в callback-функцию, а не возвращается из функции. В JavaScript это часто реализуется с помощью error-first callbacks: первый аргумент callback - ошибка (null при успехе), второй - данные. Такой подход был стандартом до появления Promise и async/await, но до сих пор используется в старых API или библиотеках (например, в Node.js fs.readFile).

Основные элементы:

  • Функция auth принимает параметры (логин, пароль) и callback.
  • Внутри происходит асинхронная операция (запрос к серверу, проверка в БД).
  • После завершения вызывается callback: либо с ошибкой (new Error(...)), либо с данными (пользователь, токен).
  • Колбек - это функция, которую передаёт вызывающий код, чтобы обработать результат.

Ключевые моменты:

  • Колбек должен вызываться ровно один раз (чтобы избежать дублирования обработки).
  • Ошибка всегда передаётся первым аргументом (соглашение Node.js).
  • Функция auth не возвращает Promise или значение - она только инициирует асинхронную операцию.

На практике

В реальных проектах колбеки для auth редко используются напрямую - чаще применяют Promise или async/await. Однако понимание паттерна важно для работы с легаси-кодом, библиотеками вроде Passport.js (стратегии с колбеками) или при написании middleware для Express. Типичный сценарий: серверная функция проверяет логин/пароль и вызывает callback с результатом, а роутер обрабатывает ответ (редирект, ошибка, сессия).

При реализации важно:

  • Не блокировать event loop (использовать асинхронные операции, например, setTimeout для имитации).
  • Обрабатывать все возможные ошибки (неверные данные, таймаут, сбой сервера).
  • Не вызывать callback несколько раз (проверять флаг или использовать guard clause).

Пример кода

JAVASCRIPT
// Функция аутентификации через колбек
function authenticateUser(username, password, callback) {
// Имитация асинхронного запроса к серверу
setTimeout(() => {
// Проверка учётных данных (упрощённо)
if (username === 'admin' && password === 'secret') {
// Успех: вызываем callback с null (нет ошибки) и данными пользователя
callback(null, { id: 1, name: 'Admin', role: 'admin' });
} else if (!username || !password) {
// Ошибка: неверные входные данные
callback(new Error('Username and password are required'));
} else {
// Ошибка: неверные учётные данные
callback(new Error('Invalid credentials'));
}
}, 1000);
}
// Использование
authenticateUser('admin', 'secret', (err, user) => {
if (err) {
console.error('Auth failed:', err.message);
return;
}
console.log('Auth success:', user.name);
});

Как отвечать на собеседовании

Начни с краткого определения: "Функция auth через колбек - это асинхронная функция, которая принимает callback для обработки результата". Затем объясни структуру: error-first callback, асинхронность, однократный вызов. Приведи пример с имитацией запроса. Упомяни, что это legacy-паттерн, но он лежит в основе Promise и async/await. Если спросят про альтернативы, скажи, что на практике лучше использовать Promise или async/await для читаемости и обработки ошибок.

Избегай: не углубляйся в теорию event loop без запроса, не критикуй колбеки слишком резко (покажи понимание их места в истории JS).

Что проверяет интервьюер

  • Понимание асинхронности в JavaScript (event loop, callback queue).
  • Знание паттерна error-first callback (соглашение Node.js).
  • Умение обрабатывать ошибки и избегать race conditions (один вызов callback).
  • Способность объяснить, как колбеки связаны с более современными подходами (Promise, async/await).
  • Практические навыки: написание и использование callback-функций без утечек памяти или дублирования.

Типичные ошибки

  • Вызов callback несколько раз (например, в if и else без return).
  • Игнорирование первого аргумента (ошибки) - обработка только данных.
  • Синхронная имитация асинхронности (прямой вызов callback без setTimeout/Promise).
  • Необработанные исключения внутри callback (нужен try-catch, если колбек синхронный).
  • Путаница с порядком аргументов (ошибка должна быть первой).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью