Обнаружить баги в функции получения данных пользователя

fetch возвращает Response, а не объект пользователя: нужны проверка response.ok и await response.json(). Пароль нельзя включать в клиентский результат; права должны подтверждаться сервером.

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

Что ответить на собеседовании

fetch возвращает Response, а не объект пользователя: нужны проверка response.ok и await response.json(). Пароль нельзя включать в клиентский результат; права должны подтверждаться сервером.

Подробный разбор

Ответ с пояснениями

Условие

В этом задании требуется проанализировать функцию и найти в ней ошибки. Обратите внимание на работу с асинхронным запросом, условные конструкции и формирование массива прав.

export async function getUserData(userId) {
  const fetchedUser = await fetch(`/api/users/${userId}`);
  const permissionsMap = { reportStats: true, validate: true };
  let result;
  switch (true) {
    case fetchedUser.role == 'admin':
      result = {
        name: fetchedUser.name,
        role: fetchedUser.role,
        password: fetchedUser.password,
        permissions: [],
      };

      Object.keys(permissionsMap).forEach(perm => {
        if (permissionsMap[perm]) {
          if (perm === 'reportStats') {
            result.permissions.push('report-stats');
          } else {
            result.permissions.push(perm);
          }
        }
      });
      break;
    case fetchedUser.role == 'regular':
      result = {
        name: fetchedUser.name,
        role: fetchedUser.role,
      };
  }

  return result;
}

Ответ

fetch возвращает Response, а не объект пользователя: нужны проверка response.ok и await response.json(). Пароль нельзя включать в клиентский результат; права должны подтверждаться сервером.

async function getUserData(userId) {
  const response = await fetch('/api/users/' + encodeURIComponent(userId));
  if (!response.ok) throw new Error('Не удалось загрузить пользователя');
  const user = await response.json();
  if (!['admin', 'regular'].includes(user.role)) throw new Error('Неизвестная роль');
  return {
    name: user.name,
    role: user.role,
    permissions: user.role === 'admin' ? ['report-stats', 'validate'] : []
  };
}

Этот список permissions воспроизводит UI-логику примера, не является механизмом авторизации. Сервер обязан самостоятельно проверять доступ и вообще не возвращать пароль/хеш в API. switch(true) синтаксически допустим, но здесь избыточен; также исходник возвращал undefined для неизвестной роли.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее