Как надстроить общение между классами REST API?

Ссылка скопирована
1 ответ

Привет. Я новичок в js, уже 2 дня не могу найти ответ.
Есть два контроллера. Как в одном контроллере обратится к другому и получить нормальный ответ?
Первый:

class categoryController {     async activ(req, res) {         db.query(             `SELECT * FROM chat_cat WHERE chat_id = ?`,             [req.query.id],             (err, data) => {                 if (err) return res.json(err)                 return res.json(data)             })     } }

class categoryController { async activ(req, res) { db.query( `SELECT * FROM chat_cat WHERE chat_id = ?`, [req.query.id], (err, data) => { if (err) return res.json(err) return res.json(data) }) } }

Второй обращаюсь к первому

async groupQuestionIdd(req, res) {         // const menu = await menuController.main()         const category = await categoryController.activ(req, (err, data) => {             if (err) return res.json(err)             return res.json(data)         })         // const categor2 = await fetch(`http://localhost:3000/api/category/groupActiv?id=${req.query.id}`)         // const resaCategory = await category.json();         // const resaCategory2 = await category2.json();         // console.log(resaCategory)         // console.log(resaCategory2)         // console.log(menu)                  return res.json('data')     }

async groupQuestionIdd(req, res) { // const menu = await menuController.main() const category = await categoryController.activ(req, (err, data) => { if (err) return res.json(err) return res.json(data) }) // const categor2 = await fetch(`http://localhost:3000/api/category/groupActiv?id=${req.query.id}`) // const resaCategory = await category.json(); // const resaCategory2 = await category2.json(); // console.log(resaCategory) // console.log(resaCategory2) // console.log(menu) return res.json('data') }

Уже по всякому пробовал, получается только через fetch, но это же бред
(В комментах как пробовал, на фото постоянная ошибка)

Как надстроить общение между классами REST API?

Подскажите, пожалуйста, хотя бы где копать

Дополнительно:

Потому что это плохая идея вызывать методы контроллера из других контроллеров и методов. Ваш activ надо вынести в модель в сервис - куда угодно. Собственно и правило - если возникают какие то трудности в базовых вещах, то скорее всего эти базовые вещи вы используете не правильно

  • Ты не можешь юзать в контроллерах другие контроллеры - потому что каждый контроллер привязан к ендпоинту на сервере. Плюс контроллерах не делают запросы к бд, их делают в сервисах. ( ты перепутал контроллеры с сервисами )

    твой метод в классе

    async activ(req, res) {         db.query(             `SELECT * FROM chat_cat WHERE chat_id = ?`,             [req.query.id],             (err, data) => {                 if (err) return res.json(err)                 return res.json(data)             })     }

    async activ(req, res) { db.query( `SELECT * FROM chat_cat WHERE chat_id = ?`, [req.query.id], (err, data) => { if (err) return res.json(err) return res.json(data) }) }

    ничего не возвращает, так что что ты ожидаешь в category - большой вопрос

    плюс так же ты вызываешь res.json - тут тоже вопросы... но да фиг с ними, надо изучить Js, потом писать, а не наоборот

    Как надстроить общение между классами REST API?

  • szQocks, как его изучать то, теорию только чтоли, вот я и изучаю на практике
  • Антон, ну на практике изучать - это хорошо, но что бы применять тот или инной функционал js - нужно ведь понимать что он делает ( а что бы понимать что он делает - надо как минимум прочитать о нём, скопировать из документации, потыкаться посмотреть как будет исполняться на какие-то изменения )

    например изучить return и что возвращает ( синхронная/асинхронная ) функция по умолчанию, что будет если из функции вернуть там какое-то странно значение например

    const f = () => (5,6); // понять что тут вернет, и почему

    const f = () => (5,6); // понять что тут вернет, и почему

    res.json is not function - базовая ошибка основ, как бы если ты основы не изучил

  • Ответы:

    Добрый день.
    Начну с того, что контроллеры Rest Api одного приложения не должны между собой общаться. У них одно предназначение: предоставить внешним системам интерфейс сервиса через http запросы. Судя по первому контроллеру вы обращаетесь к БД за данными. Поэтому, непосредственная работа с данными должна выполняться отдельным сервисом. А вот уже этот сервис должны использовать rest-контроллеры. Структура в простом виде выглядит так: абстрактный интерфейс - реализация интерфейса - rest контроллер для внешних систем.

    • спасибо, я познакомился с nest js и всё стало на свои места
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Дмитрий К. Ответ

    Для надстройки общения между классами через REST API вам следует использовать HTTP запросы для обмена данными между различными классами или компонентами вашего приложения. Здесь приведу пример использования PHP для отправки HTTP запросов между классами:

    class RESTClient {
        private $base_url;
     
        public function __construct($base_url) {
            $this->base_url = $base_url;
        }
     
        public function get($endpoint) {
            $url = $this->base_url . $endpoint;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $response = curl_exec($ch);
            curl_close($ch);
            return $response;
        }
     
        public function post($endpoint, $data) {
            $url = $this->base_url . $endpoint;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $response = curl_exec($ch);
            curl_close($ch);
            return $response;
        }
    }
     
    // Пример использования
    $rest_client = new RESTClient('http://api.example.com');
    $response = $rest_client->get('/users');
    echo $response;

    class RESTClient { private $base_url; public function __construct($base_url) { $this->base_url = $base_url; } public function get($endpoint) { $url = $this->base_url . $endpoint; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } public function post($endpoint, $data) { $url = $this->base_url . $endpoint; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } } // Пример использования $rest_client = new RESTClient('http://api.example.com'); $response = $rest_client->get('/users'); echo $response;

    В данном примере создается класс RESTClient, который содержит методы для выполнения GET и POST запросов через cURL. Вы можете использовать этот класс для отправки запросов между вашими классами через REST API.

    Не забудьте адаптировать этот пример под ваши конкретные потребности и убедиться, что ваш сервер и API поддерживают RESTful структуру.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно