@holllop

Как правильно сделать сложный запрос к БД, через Node.js?

Хочу сделать сложный запрос к моей базе данных
const getPrinter_material = (printer_id, response) => {
  pool.query(`SELECT pr.printer_id, m.material
  FROM printer_material pm
  JOIN printer pr ON pm.printer_id = pr.printer_id
  JOIN material m ON pm.material_id = m.material_id
  WHERE pr.printer_id = ${printer_id};`, (error, results) => {
    if (error) {
      throw error;
    }
    response.status(200).json(results.rows);
  });
};

как вы видите в запросе к базе я использую константу printer_id получаю я её вот таким образом
const postPrinterData = (request, response) => {
  const printer_id = parseInt(request.body.printer_id, 10);

  // Выполнить нужные действия с полученным printerId
  console.log('Получен printer_id:', printer_id);

  // Отправка printer_id для GET-запроса
  getPrinter_material(printer_id, response);
};

В этот раз я точно уверен что в константе printer_id передаётся число, а не строка. То есть я уверен, что я не правильно использую константу printer_id, т.к у меня выдаёт ошибку ошибка синтаксиса (примерное положение: "[") и эта ошибка указывает на строку throw error;
Подскажите как правильно использовать константу, что бы в итоге получался SQL запрос такого типа
SELECT pr.printer_id, m.material
  FROM printer_material pm
  JOIN printer pr ON pm.printer_id = pr.printer_id
  JOIN material m ON pm.material_id = m.material_id
  WHERE pr.printer_id = значение;

где значение берётся из константы
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
@holllop Автор вопроса
Прежде чем ответить, хочу поблагодарить kosuha. Ты мне очень помог реально. Как оказалось мне не нужна сложная структура типа GET запрос зависящий от POST запроса(из-за чего у меня и возникала ошибка
TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Socket'
    |     property 'parser' -> object with constructor 'HTTPParser'
    --- property 'socket' closes the circle
)
дальше я приведу как я решил свою проблему
клиент-код
function loadSelectOptions2(url, selectElement) {
  fetch(url)
    .then(response => response.json())
    .then(data => {
      data.forEach(item => {
        const option = createOption(item.printer_id, item.material);
        selectElement.appendChild(option);
      });
    })
    .catch(error => {
      console.error(error);
      // Обработать ошибку
    });
}
selectElement2.addEventListener('change', () => {
    const selectedPrinterId = selectElement2.value;
    console.log('selectedPrinterId:', selectedPrinterId);
    // Очистить select3 перед загрузкой новых опций
    selectElement3.innerHTML = '';
    // Загрузить опции для select3 на основе выбранного значения select2
    if (selectedPrinterId) {
      const url = `http://:3000/printer_material?printer_id=${encodeURIComponent(selectedPrinterId)}`;
      loadSelectOptions2(url, selectElement3);
    }
  });

код сервера
const http = require('http');
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const db = require('./pool');

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

app.use(bodyParser.json());
app.use(
  bodyParser.urlencoded({
    extended: true,
  })
);
app.use(cors());
app.get('/printer_material', (req, res) => {
  const printer_id = parseInt(req.query.printer_id, 10);

  console.log('Received printer_id:', printer_id); // Вывод значения в консоль как число

  db.getPrinter_material(printer_id, res);
});
http.createServer(app).listen(port, () => {
  console.log(`App running on port ${port}.`);
});

//pool.js
const { response } = require('express');

const Pool = require('pg').Pool;
const pool = new Pool({
  user: '',
  host: '',
  database: '',
  password: '',
  port: 5432,
});

const getPrinter_material = (printer_id, response) => {
  console.log('Received printer_id:', printer_id); 

  pool.connect((error, client, release) => {
    if (error) {
      throw error;
    }

    const query = {
      text: `SELECT pr.printer_id, m.material FROM printer_material pm JOIN printer pr ON pm.printer_id = pr.printer_id JOIN material m ON pm.material_id = m.material_id WHERE pr.printer_id = $1`,
      values: [printer_id],
    };

    console.log('Query text:', query.text);

    client.query(query, (error, results) => {
      release();

      if (error) {
        throw error;
      }

      console.log(results.rows);
      response.json(results.rows);
    });
  });
};
module.exports = {
  getPrinter_material,
};

Я не убирал множественные console.log пока они остались так как я часть за частью проверял работоспособность кода
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы