Как можно сформулировать сложный запрос к базе данных с использованием Node.js?

Как правильно использовать константу `printer_id` в данном коде, чтобы избежать ошибки синтаксиса и получить SQL запрос с использованием значения из этой константы?
  • 22 сентября 2023 г. 7:57
Ответы на вопрос 2
Для сформулирования сложного запроса к базе данных с использованием Node.js и константы `printer_id`, можно воспользоваться параметризованными запросами с использованием библиотеки `mysql` или `pg` (в зависимости от используемой базы данных).

Вот пример использования константы `printer_id` в параметризованном запросе с использованием библиотеки `mysql`:

```javascript
const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'username',
  password: 'password',
  database: 'database_name',
});

const printer_id = 1; // Значение константы printer_id

const query = 'SELECT * FROM printers WHERE id = ?'; // Используется ? как заполнитель

connection.query(query, [printer_id], function (error, results, fields) {
  if (error) throw error;
  console.log(results);
});

connection.end();
```

В данном примере, переменная `printer_id` содержит значение 1. Затем, в SQL запросе используется `?` в качестве заполнителя для значения константы `printer_id`. При выполнении запроса с использованием `mysql` соединения, переменная `printer_id` передается в качестве второго аргумента функции `query`, указывая его значение в массиве `[printer_id]`.

Аналогичное решение можно применить для библиотеки `pg` (для работы с PostgreSQL):

```javascript
const { Pool } = require('pg');

const pool = new Pool({
  user: 'username',
  password: 'password',
  host: 'localhost',
  port: 5432,
  database: 'database_name',
});

const printer_id = 1; // Значение константы printer_id

const query = 'SELECT * FROM printers WHERE id = $1'; // Используется $1 в качестве заполнителя

pool.query(query, [printer_id], (error, results) => {
  if (error) throw error;
  console.log(results.rows);
  pool.end();
});
```

В данном примере, переменная `printer_id` содержит значение 1. Затем, в SQL запросе используется `$1` в качестве заполнителя для значения константы `printer_id`. При выполнении запроса с использованием `pg` пула соединений, переменная `printer_id` передается в качестве второго аргумента функции `query`, указывая его значение в массиве `[printer_id]`.
Прежде чем ответить, хочу поблагодарить kosuha за помощь. Вы действительно сильно мне помогли. Теперь я понял, что мне не нужна сложная структура с зависимостью GET запроса от POST запроса, которая вызывала ошибку TypeError: Converting circular structure to JSON. Далее я приведу, как я решил мою проблему.

Код клиента:
```javascript
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:
```javascript
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, так как я поэтапно проверял работоспособность кода.
Похожие вопросы