Страницы

суббота, 3 сентября 2016 г.

VS Code Node.js Debugging

В VS Code есть встроенный дебаггер, но не смотря на то, что я использую этот инструмент уже давно, Node.js код я дебажу с помощью node-inspector. Сначала запускаю дебаггер: node-inspector --web-port 8088 --save-live-edit true --preload false, затем приложение: node --debug app или node --debug-brk app (по ситуации), после чего открываю в браузере интерфейс дебаггера по адресу http://127.0.0.1:8088/?ws=127.0.0.1:8088&port=5858. Расскажу как я пытался перейти на встроенный дебаггер VS Code.


Допустим у нас есть приложение (app.js), которое рассказывает об изменении своего состояния другому сервису (logger.js).
- app.js:
'use strict';
 
const http = require('http');
 
const checkin = (status, cb) => http.get({
  port: 3030,
  headers: {
    'x-server-port': 3000,
    'x-server-status': status
  }
}, (res) => {
  if (res.statusCode !== 200) return cb(new Error('Epic fail'));
  cb();
}).on('error', cb);
 
http.createServer((req, res) => {
  res.writeHead(200, { 'content-type': 'text/html' });
  res.end('<h2>Hello, world!</h2>');
}).listen(3000, (err) => {
  if (err) throw err;
  checkin('on', (err) => {
    if (err) throw err;
    console.log('Listen on port 3000');
  });
});
 
process.once('SIGINT', () => {
  checkin('off', (err) => {
    if (err) console.error(err);
    process.exit(0);
  });
});

- logger.js:
'use strict';
 
const http = require('http');
 
const log = (headers) => {
  console.log(`port: ${headers['x-server-port']}, status: ${headers['x-server-status']}`);
};
 
http.createServer((req, res) => {
  log(req.headers);
  res.writeHead(200);
  res.end();
}).listen(3030, (err) => {
  if (err) throw err;
  console.log('Listen on port 3030');
});

Запускаем логгер, приложение, останавливаем приложение...


... в общем ясно как все должно работать.

А теперь попробуем дебажить код приложения с помощью встроенного дебаггера: запускаем, останавливаем...


... разумеется приложение ничего не сообщило логгеру т.к. мы слушаем только событие SIGINT процесса.

Беда в том, что дебаггер не отправляет ни SIGINT, ни какого-либо иного сигнала приложению (в Windows вообще нет POSIX-сигналов), а обработчик события exit не работает асинхронно.

Поэтому лучше запустить приложение руками, можно из встроенного в VS Code терминала:

Подключаемся к дебаггеру:

Вуаля:

Останавливаем приложение:

Все ОК, единственное неудобство - по Ctrl+C закрывается терминал.

That's all folks!

P.S. Вчера, 09.09.2016, вышло очередное обновление VS Code в результате которого в дебаге Node.js кое-что изменилось.

P.P.S. В версии 1.8 решили вопрос с Ctrl+C, ура.