Дикий Григорий

Full-stack веб-разработчик

API на Node.JS: Роутинг. Часть 2

Добрый времени суток, дорогие читатели! Сегодня мы продолжим изучение Node.JS посредством создания API. Это сложное задание, так как требует особого подхода к архитектуре приложения, чтобы в последствии клиенты могли получать данные без особого труда. Попробуем создать роутинг для отдачи статического JSON для моделирования API для этого добавим пару обработчиков GET запроса:

import express from "express";

const PORT = 3000;
const app = express();

app.get("/", (req, res) => res.json({status: "Task API"}));
app.get("/tasks", (req, res) => {
  res.json({
    tasks: [
      {title: "Buy some shoes"},
      {title: "Fix notebook"}
    ]
  });
});

app.listen(PORT, () => console.log(`Task API - Port ${PORT}`));

Запустим наше приложение и откроем ссылку http://localhost:3000/tasks. В итоге вы должны получить следующее:

Для того, чтобы приходил форматированный текст JSON'а нужно добавить инструкцию:
app.set("json spaces", 2);
В итоге после перезапуска сервера мы должны получить ответ в таком виде:

Вместо того, чтобы писать все в index.js можно подгружать код из файлов используя consign. Для этого давайте установим этот пакет:

npm install consign@0.1.2 --save
Теперь мы имеем возможность разделить логику приложения. Для этого создадим директорию routes в которой будут хранится 2 файла: index.js, tasks.js. В файле index.js будем хранить обработку GET /:
module.exports = app => {
  app.get("/", (req, res) => {
    res.json({status: "Task API"})
  });
};
А в фале tasks.js будет происходить GET обработка пути /tasks:
module.exports = app =>{
  app.get("/tasks", (req, res) => {
    res.json({
      tasks: [
        {title: "Buy some shoes"},
        {title: "Fix notebook"}
      ]
    });
  });
};
Теперь стоит изменить файл index.js из корневой директории, чтобы модуль consign подгружал эти данные из файлов
import express from "express";
import consign from "consign";

const PORT = 3000;
const app = express();

app.set("json spaces", 2);

consign()
  .include("routes")
  .into(app);

app.listen(PORT, () => console.log(`Task API - Port ${PORT}`));

Для работы с MVC нам нужны модели, и для этого нужно создать папку models, которая будет включатся в приложение через consign:

consign()
  .include("models")
  .then("routes")
  .into(app);

На данный момент эта директория не содержит никаких файлов, чтобы это исправить нужно создать внутри файл tasks.js со следующим содержимым:

module.exports = app => {
  return {
    findAll: (params, callback) => {
       return callback([
        {title: "Buy some shoes"},
        {title: "Fix notebook"}
      ]);
    }
  }
}

В этой модели отдается объект с полем findAll, которое представляет собой функцию оправляющую статичный данные. Но для того, чтобы работать с этой моделью надо переписать файл routes/tasks.js:

module.exports = app => {
  const Tasks = app.models.tasks;

  app.get("/tasks", (req, res) => {
    Tasks.findAll({}, tasks => {
      res.json({tasks: tasks});
    });
  });
};

Теперь наше приложение работает с моделями. На данный момент это статичные модели, но вскоре после подключения библиотеки для работы с базой данных приложение перерастет в полноценный MVC проект.

Чтобы сделать приложение более структурированным создадим директорию libs с файлами boot.js и middlewares.js. Начнем с редактирования фала с middlewares:

module.exports = app => {
  app.set("port", 3000);
  app.set("json spaces", 2);
};

Таким образом мы теперь разбили логику и добавили в файл moddlewares.js. Файл boot.js будет заниматься инициализацией сервера:

module.exports = app => {
  app.listen(app.get("port"), () => console.log(`Task API - Port ${app.get("port")}`));
}

Для того, чтобы применить изменения к проекту, нужно изменить файл index.js в корневой директории:

import express from "express";
import consign from "consign";

const app = express();

consign()
  .include("models")
  .then("libs/middlewares.js")
  .then("routes")
  .then("libs/boot.js")
  .into(app);

Теперь можно точно убедится, что приложение работает как надо, но зато мы сделали рефакторинг, который позволит в будущем безболезненно расширять возможности нашего приложения. На сегодня все.

Ссылка на проект: https://github.com/dikiigr/nodejs-api