У меня есть код, в котором я пытаюсь получить список доступных материалов для выбранного принтера из базы данных. Я использую 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,
};
```
Моя концепция состоит в том, чтобы пользователь выбрал принтер и передал его на сервер, а затем я использовал это значение для запроса к базе данных и получения списка доступных материалов для этого принтера. Я хотел бы узнать, правильно ли я это делаю и как могу его улучшить.
Да, вы правильно понимаете использование 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` было передано корректным образом и содержит ожидаемый тип данных.
Надеюсь, эти рекомендации помогут вам улучшить ваш код!