Правильно ли я понимаю, что вы имеете в виду использование GET запроса, который зависит от POST запроса, и хотите убедиться, что делаете это правильно?

У меня есть код, в котором я пытаюсь получить список доступных материалов для выбранного принтера из базы данных. Я использую Express для создания сервера API, а PostgreSQL для работы с базой данных. Ошибок не возникает, но я не уверен, правильно ли я это реализовал. Можете ли вы проверить мой подход и подсказать, что я могу улучшить?
```javascript
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('/get_materials', db.getPrinterMaterials);

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: ,
});

const getPrinterMaterials = (request, response) => {
  const materialId = request.body.materialId;
  
  pool.query(`SELECT pr.material FROM table WHERE pr.material = ${materialId}`, (error, results) => {
    if (error) {
      throw error;
    }
    response.status(200).json(results.rows);
  });
};

module.exports = {
  getPrinterMaterials,
};
```

Моя концепция состоит в том, чтобы пользователь выбрал принтер и передал его на сервер, а затем я использовал это значение для запроса к базе данных и получения списка доступных материалов для этого принтера. Я хотел бы узнать, правильно ли я это делаю и как могу его улучшить.
  • 13 сентября 2023 г. 7:38
Ответы на вопрос 1
Да, вы правильно понимаете использование GET запроса, который зависит от POST запроса. 

В целом, ваш подход выглядит правильным. Приведу несколько рекомендаций для улучшения вашего кода:

1. Используйте параметры маршрута вместо запросов POST. Маршрутизация по параметрам в URL позволит вам передавать данные в GET запросе, а не в POST запросе. Например:
```javascript
app.get('/get_materials/:materialId', db.getPrinterMaterials);
```
Затем измените обработчик маршрута в `pool.js` следующим образом:
```javascript
const getPrinterMaterials = (request, response) => {
  const materialId = request.params.materialId;
  // ...
};
```
Исправьте ваш клиентский код, чтобы отправлять GET запрос с параметром `materialId`.

2. Используйте параметризованные запросы, чтобы избежать уязвимостей SQL-инъекций. В параметрах маршрута вашего запроса к базе данных, используйте символ `$1`, чтобы указать место, где будет вставлено значение `materialId`. Затем передайте значение как аргумент к `query` методу пула. Пример:
```javascript
pool.query('SELECT pr.material FROM table WHERE pr.material = $1', [materialId], (error, results) => {
  // ...
});
```

3. Обрабатывайте возможные ошибки базы данных и возвращайте соответствующий статус ответа. Вместо использования `throw error`, вы можете отправить код ошибки и сообщение в ответе. Например:
```javascript
if (error) {
  response.status(500).json({ error: 'Ошибка базы данных' });
  return;
}
```

4. Рассмотрите возможность добавления проверок входных данных для предотвращения некорректных запросов. Например, убедитесь, что поле `materialId` было передано корректным образом и содержит ожидаемый тип данных.

Надеюсь, эти рекомендации помогут вам улучшить ваш код!
Похожие вопросы