Как отлаживать 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. Вы увидите, что это строка, а не число. Исправление — преобразование типов, как описано в основном ответе.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги