Node.js простой логгер HTTP заголовков
JavaScript

Временами полезно знать, какие именно заголовки отправляет HTTP клиент серверу, особенно во время отладки.

Приведенный ниже пример, позволяет простым способом решить данную задачу, с помощью встроенных модулей Node.js. Ровно тот случай, когда проще (и даже интереснее) написать элементарный «http сервер» самому, чем разбираться с готовыми продуктами — настраивать логи, устанавливать wireshark и тому подобное. Тем более «нода» сегодня очень популярна и наверняка уже установлена у многих программистов.

Я поддерживаю у себя домен .hm (home) для удобства разработки, дабы не путаться, отсюда и хост wisereport.hm

Давайте попробуем передать POST

> curl -d foo=bar wisereport.hm:3000
Got it! (request# 3)

Для удобства использования, каждый запрос имеет свой порядковый номер, который отправляется в качестве ответа и указывается в консоли. Таким образом вы не потеряетесь в списке данных при длительной работе.

//server.js
const http = require('http');
const qs = require('querystring');
const port = 3000;

var requestNumber = 1;

const requestHandler = (request, response) => {

    console.log('\x1b[0m\n--------------------\n');
    console.log('\x1b[93m%s %s \x1b[0m(request# %d) \n', 
                request.method, request.url, requestNumber);

    for (var property in request.headers) {
       if (request.headers.hasOwnProperty(property)) {
          console.log('\x1b[32m%s: \x1b[0m%s', property, request.headers[property]);
       }
    }

    if (request.method !== 'GET') {

       var body = '';

       request.on('data', (data) => {
           body += data;
       });

       request.on('end', () => {
          console.log('\x1b[96m');
          console.log(qs.parse(body));
       });
    }

    response.end('Got it! (request# ' + requestNumber + ')');
    requestNumber++;
}

const server = http.createServer(requestHandler);

server.listen(port, (err) => {
  if (err) {
    return console.log('something bad happened', err);
  }

  console.log(`server is listening on ${port}`);
});

Для тех кто плохо знаком со «стрелочными функциями» (arrow functions), запись (foo) => {} тоже самое что function(foo){} если не вдаваться в подробности. Данный синтаксис поддерживается node.js начиная с версии 4.4.5, на момент написания данного поста, актуальная версия 8.9.1. Так же, arrow functions поддерживаются в ECMAScript 6.

Так же используется цветная подсветка текста в терминале — ANSI, например «\x1b[32m» — зеленый.

Разумеется, данный скрипт весьма простой и поэтому не блещет функционалом/защищенностью, но мы ведь не собираемся его использовать в продакшн, правда ведь? 😉

И да, он прекрасно работает в терминале Windows тоже.

Добавить комментарий