Контроллер
Контроллер – это основная составляющая нашего api. Поэтому я хочу разобрать её максимально подробно. Суть контроллера – в выполнении требуемых действий и отправки результата клиенту. Так как мы используем мой плагин маршрутизации, то и контроллер, который мы напишем, будет специфическим. Сам контроллер представляет из себя просто объект с данными и функцией, как пример, который вы видели в предыдущей главе. Давайте создадим новый контроллер с именем user.js. И сделаем экспорт в этом файле:
module.exports = {
***
}
Там, где "***", будут находиться любые нужные нам данные.
Зарезервированы объекты с именами method, url и config, они нужны нам для правильной конфигурации котроллера.
Создадим объект method и укажем один из параметров:
'DELETE'
, 'GET'
, 'HEAD'
, 'PATCH'
, 'POST'
, 'PUT'
, 'OPTIONS'
module.exports = {
method: "GET"
}
Далее нам нужна сама функция, которая будет обрабатывать наш GET запрос: * функция должна быть асинхронной и называться execute Данная функция принимает 3 параметра: fastify – объект самого api, в нём хранятся все наши плагины, которые мы подключаем и прочий функционал; request – объект полученного запроса, в нём хранятся все данные, которые вы получили от клиента; reply – он нам нужен для отправки ответа клиенту.
module.exports = {
method: "GET",
async execute(fastify, request, reply) {
try {
reply
.code(200)
.header('Content-Type', 'application/json; charset=utf-8')
.send({ message: "I'm super api" });
}
catch (error) {
reply
.code(500)
.header('Content-Type', 'application/json; charset=utf-8')
.send({ message: "This is very bad =(" });
}
}
}
Сейчас мы получили ровно такой же контроллер, как из предыдущего раздела.
Но, в отличии от предыдущего, мы сможем обратиться к нему по пути: http://127.0.0.1:18301/user Но почему же файл index.js дает нам доступ по пути http://127.0.0.1:18301/ а не http://127.0.0.1:18301/index Дело в том, что я реализовал в своей библиотеке 3 вида маршрутов : Внимание! Контроллер не должен быть пустым файлом. Для проверки можете просто копировать код контроллера, который мы написали ранее. 1. Вложенный в папки. Каждая папка – это часть пути, к примеру если вы создадите папку users в папке controllers, а в ней файл create.js, то доступ к контроллеру вы получите по пути: http://127.0.0.1:18301/users/create 2. Корневой маршрут. Контроллер с именем index.js заменяется на /. Создадим файл index.js, в ранее созданной папке users. В итоге мы можем получить доступ к контроллеру через url: http://127.0.0.1:18301/users/ 3. Динамический роутинг. Если клиент хочет запросить у вас данные относительно одного пользователя, то выстраиваем такую конструкцию: создаем папку user и в ней файл [id].js. В итоге мы можем получить от клиента id user'a и дать ответ, к примеру его имя, но такой контроллер немного отличается от двух выше. Отличается тем, что в имени контроллера мы указываем имя переменной, которую будем получать: [id].js - переменная id [name].js - переменная name ... и так делее. *Но соответственно в одной папке может быть только один такой контроллер.
Чтобы проверить данный тип кронтроллеров, создадим новый контроллер /user/[id].js:
module.exports = {
method: "GET",
async execute(fastify, request, reply) {
try {
// Получаем id
let id = request.params?.id;
// Тут может быть запрос к БД. Для примера маленький массив
let users = [
{ name: "Антон", sex: 2},
{ name: "Артур", sex: 2},
{ name: "Алиса", sex: 1}
]
// Проверяем не передали ли нам отрицательное число,
// либо id больше того который у нас есть
if(id >= 0 && id <= users.length - 1){
reply
.code(200)
.header('Content-Type', 'application/json; charset=utf-8')
.send(users[id]);
}
else {
reply
.code(404)
.header('Content-Type', 'application/json; charset=utf-8')
.send("Not Found");
}
}
catch (error) {
reply
.code(500)
.header('Content-Type', 'application/json; charset=utf-8')
.send("This is very bad =(");
}
}
}
В итоге, запустив наш api, мы можем получить данные по 3м url: http://127.0.0.1:18301/user/0 - { name: "Антон", sex: 2} http://127.0.0.1:18301/user/1 - { name: "Артур", sex: 2} http://127.0.0.1:18301/user/2 - { name: "Алиса", sex: 1} http://127.0.0.1:18301/user/3 - Not Found
Всё правильно? Если да, то мы справились с контроллерами, дальше мы будем совершенствовать их.
Last updated
Was this helpful?