Avatar ·

Как отлаживать Node.js приложения: пошаговое руководство для новичков

Всем привет! Я только начал изучать Node.js и пишу свой первый сервер на Express. Столкнулся с проблемой: мое приложение работает не так, как я ожидаю. Вот упрощенный код: ```javascript const express = require('express'); const app = express(); app.get('/users/:id', (req, res) => { const userId = req.params.id; const user = getUserById(userId); res.json({ user: user }); }); app.listen(3000, () => { console.log('Server running on port 3000'); }); function getUserById(id) { const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; return users.find(u => u.id === id); } ``` Я делаю GET-запрос на `/users/1`, но всегда получаю `{ "user": undefined }`. Я не понимаю, почему `find()` не находит пользователя. Я пробовал вставлять `console.log()` везде, но это не помогает — я вижу, что `id` приходит, а пользователь не находится. Подскажите, как правильно отлаживать такие проблемы? Может, есть способ посмотреть, что происходит внутри функции шаг за шагом? Я слышал про Chrome DevTools, но не знаю, как их подключить к Node.js. Буду благодарен за подробное объяснение! <<>>

Использование встроенного отладчика Node.js и Chrome DevTools

Ваша проблема — классический пример ошибки неявного преобразования типов. req.params.id возвращает строку "1", а в массиве id — числа. find() использует строгое сравнение ===, поэтому строка "1" не равна числу 1. Давайте разберем, как правильно отлаживать такие ситуации.

1. Базовый подход: console.log с умом

Вместо того чтобы вставлять console.log наугад, используйте структурированный вывод:

function getUserById(id) {
  console.log('getUserById called with:', { id, type: typeof id });
  const users = [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' }
  ];
  console.log('Users array:', users);
  const result = users.find(u => {
    console.log('Comparing:', { uId: u.id, uIdType: typeof u.id, targetId: id, targetType: typeof id, equal: u.id === id });
    return u.id === id;
  });
  console.log('Result:', result);
  return result;
}

Это сразу покажет, что типы разные. Но это неудобно для сложных приложений.

2. Использование встроенного отладчика Node.js (рекомендуемый способ)

Node.js имеет встроенный отладчик, который можно подключить к Chrome DevTools:

  • Запустите приложение с флагом --inspect: node --inspect app.js
  • В терминале появится ссылка типа chrome-devtools://devtools/...
  • Откройте Chrome и в адресной строке введите chrome://inspect
  • Нажмите "Open dedicated DevTools for Node" или найдите ваше приложение в списке Remote Target

Теперь вы можете:

  • Ставить точки останова (breakpoints) — кликните по номеру строки в редакторе кода в DevTools
  • Шагать по коду — используйте кнопки Step Over (F10), Step Into (F11), Step Out (Shift+F11)
  • Смотреть значения переменных — в панели Scope справа
  • Выполнять выражения — в консоли DevTools во время паузы

Для вашего примера поставьте точку останова на строке с find и посмотрите, что приходит в id.

3. Альтернатива: debugger в коде

Можно явно указать точку останова в коде:

function getUserById(id) {
  debugger; // Остановка здесь при запуске с --inspect
  const users = [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' }
  ];
  return users.find(u => u.id === id);
}

4. Решение вашей проблемы

Исправление — привести id к числу:

app.get('/users/:id', (req, res) => {
  const userId = Number(req.params.id); // или parseInt(req.params.id, 10)
  const user = getUserById(userId);
  res.json({ user: user });
});

Теперь отладчик покажет, что типы совпадают, и find сработает корректно.

Продвинутые советы

  • Используйте node --inspect-brk app.js — приложение остановится на первой строке, позволяя отладить инициализацию
  • Для продакшена используйте логирование через pino или winston вместо console.log
  • Попробуйте VS Code: встроенный отладчик (F5) работает аналогично Chrome DevTools
<<>>

Использование VS Code для отладки Node.js

Если вы работаете в Visual Studio Code, отладка становится еще проще. VS Code имеет встроенную поддержку отладки Node.js без необходимости открывать браузер.

Настройка:

  • Откройте ваш проект в VS Code
  • Нажмите Ctrl+Shift+D (или Cmd+Shift+D на Mac) для открытия панели отладки
  • Нажмите на шестеренку для создания файла launch.json
  • Выберите "Node.js" из списка

Готовый конфиг будет выглядеть так:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "skipFiles": ["<node_internals>/**"],
      "program": "${workspaceFolder}/app.js"
    }
  ]
}

Теперь вы можете:

  • Ставить точки останова кликом слева от номера строки
  • Запускать отладку клавишей F5
  • Смотреть переменные в панели "VARIABLES"
  • Использовать панель "WATCH" для отслеживания выражений

Дополнительный совет: Используйте node --inspect-brk в терминале VS Code, если нужно отладить запуск приложения. А для вашей конкретной проблемы — поставьте точку останова на строке с find и посмотрите тип id в панели VARIABLES. Вы увидите, что это строка, а не число. Исправление — преобразование типов, как описано в основном ответе.