Контроллер

Контроллер – это основная составляющая нашего 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?