HTTP-сервер на Node.js
ЛР05
Создаем на Github репозиторий cwp-05, клонируем его, открываем в IDE
Создаем файл index.js
Напишем в нем самый простой http-сервер
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
Запустим сервер - node index.js
Запустим браузер и перейдем по адресу 127.0.0.1:3000, должны увидеть наше приветствие
Перепишем наш сервер для того, чтобы он принимал и возвращал JSON
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  parseBodyJson(req, (err, payload) => {
    const c = { c: payload.a + payload.b };

    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.end( JSON.stringify(c) );
  });
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

function parseBodyJson(req, cb) {
  let body = [];

  req.on('data', function(chunk) {
    body.push(chunk);
  }).on('end', function() {
    body = Buffer.concat(body).toString();

    let params = JSON.parse(body);

    cb(null, params);
  });
}
Перезапустим наш сервер. Остановить запущееный в терминале сервер можно комбанацией клавиш Ctrl + C
Установим программу для отправки HTTP-запросов Postman
Через Postman отправим POST запрос в формате JSON на уже знакомый адрес с телом
{
  "a": 41,
  "b": 1
}
Должны получить следующий ответ
{
  "с": 42
}
Выделим отдельный URL для суммирования чисел
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const handlers = {
  '/sum': sum
};

const server = http.createServer((req, res) => {
  parseBodyJson(req, (err, payload) => {
    const handler = getHandler(req.url);

    handler(req, res, payload, (err, result) => {
      if (err) {
        res.statusCode = err.code;
        res.setHeader('Content-Type', 'application/json');
        res.end( JSON.stringify(err) );

        return;
      }

      res.statusCode = 200;
      res.setHeader('Content-Type', 'application/json');
      res.end( JSON.stringify(result) );
    });
  });
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

function getHandler(url) {
  return handlers[url] || notFound;
}

function sum(req, res, payload, cb) {
  const result = { c: payload.a + payload.b };

  cb(null, result);
}

function notFound(req, res, payload, cb) {
  cb({ code: 404, message: 'Not found'});
}

function parseBodyJson(req, cb) {
  let body = [];

  req.on('data', function(chunk) {
    body.push(chunk);
  }).on('end', function() {
    body = Buffer.concat(body).toString();

    let params = JSON.parse(body);

    cb(null, params);
  });
}
Перезапустим наш сервер ещё раз и проверим его работу через Postman. URL теперь поменялся на 127.0.0.1:3000/sum
Попробуем отправить запрос на другой URL, например, 127.0.0.1:3000/mult
Теперь нам необходимо расширить функционал нашего сервера. Он должен предоставлять возможность выполнять CRUD-операции для статей и комментариев к этим статьям
1. Массив статей/комментариев хранить в файле articles.json и загружать при запуске сервера. Важно чтобы сервер не начинал принимать запросы до того как массив станет доступен
2. Модель статьи:
"id": int / string
"title": string
"text": string
"date": int
"author": string
"comments": array
3. Модель комментария:
"id": int / string
"articleId": int / string
"text": string
"date": int
"author": string
4. Реализовать логику для следующих URL:

/api/articles/readall - возвращает массив статей с комментариями

/api/articles/read - возвращает статью с комментариями по переданному в теле запроса id

/api/articles/create - создает статью с переданными в теле запроса параметрами / id генерируется на сервере / сервер возвращает созданную статью

/api/articles/update - обновляет статью с переданными параметрами по переданному id

/api/articles/delete - удаляет статью по переданному id

/api/comments/create - создает комментарий для статьи с переданными в теле запроса параметрами (в том числе articleId) / id генерируется на сервере / сервер возвращает созданный комментарий

/api/comments/delete - удаляет комментарий по переданному id
5. На операции создания, обновления и удаления сервер должен также обновлять файл articles.json
6. Сервер должен вести логи для всех запросов на сервер с информацией о дате и времени запроса, запрашиваемом URL и теле запроса. Оформим лог с хорошими отступами, чтобы было удобнее читать
7. Запрограммируем ответы сервера таким образом, чтобы клиенту не требовалось дожидаться записи в лог и дампа файла articles.json
8. Вынесем обработчики разных URL в отдельные файлы
9. Запрограммируем валидацию для входных данных, чтобы убедится что клиент посылает нам достаточно данных. В случае если данных недостаточно либо формат данных неверен будем возвращать ошибку
{
  "code": 400,
  "message: "Request invalid"
}
Синхронизируем локальный репозиторий с удаленным (сделаем push на Github)
Покажите историю коммитов своего репозитория на Github
Продемонстрируйте запросы через Postman
Продемонстрируйте логи сервера
Документация модуля http