### Структура проекта
```
project/
├── data/
│ └── surveys.json
├── app.js
└── package.json
```
### Шаг 1: Инициализация проекта
1. Создаем папку проекта и переходим в неё:
```bash
mkdir project
cd project
```
2. Инициализируем npm:
```bash
npm init -y
```
3. Устанавливаем Express.js:
```bash
npm install express
```
### Шаг 2: Создаем файл `surveys.json` для хранения опросов
Создаем папку `data` и файл `surveys.json` в ней с начальным содержимым:
```json
[]
```
Это будет массив объектов, где каждый объект — отдельный опрос.
### Шаг 3: Создаем файл `app.js` для серверной логики
Вот код для `app.js`:
```javascript
const express = require('express');
const fs = require('fs');
const app = express();
app.use(express.json());
const surveysFilePath = './data/surveys.json';
// Функция для чтения данных из файла
const readSurveys = () => {
const data = fs.readFileSync(surveysFilePath, 'utf-8');
return JSON.parse(data);
};
// Функция для записи данных в файл
const writeSurveys = (surveys) => {
fs.writeFileSync(surveysFilePath, JSON.stringify(surveys, null, 2));
};
// Создание нового опроса
app.post('/surveys', (req, res) => {
const surveys = readSurveys();
const newSurvey = { id: Date.now(), ...req.body, editable: true };
surveys.push(newSurvey);
writeSurveys(surveys);
res.status(201).json(newSurvey);
});
// Получение всех опросов
app.get('/surveys', (req, res) => {
const surveys = readSurveys();
res.json(surveys);
});
// Редактирование опроса (если он редактируемый)
app.put('/surveys/:id', (req, res) => {
const surveys = readSurveys();
const surveyId = parseInt(req.params.id);
const surveyIndex = surveys.findIndex(survey => survey.id === surveyId);
if (surveyIndex === -1) {
return res.status(404).json({ error: 'Survey not found' });
}
if (!surveys[surveyIndex].editable) {
return res.status(403).json({ error: 'Survey cannot be edited' });
}
surveys[surveyIndex] = { ...surveys[surveyIndex], ...req.body, editable: false };
writeSurveys(surveys);
res.json(surveys[surveyIndex]);
});
// Удаление опроса
app.delete('/surveys/:id', (req, res) => {
const surveys = readSurveys();
const surveyId = parseInt(req.params.id);
const newSurveys = surveys.filter(survey => survey.id !== surveyId);
if (newSurveys.length === surveys.length) {
return res.status(404).json({ error: 'Survey not found' });
}
writeSurveys(newSurveys);
res.status(204).send();
});
// Запуск сервера
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
```
### Пояснение к коду:
1. *Маршруты*:
- `POST /surveys` – создание нового опроса с полем `editable: true`.
- `GET /surveys` – получение всех опросов.
- `PUT /surveys/:id` – редактирование опроса по ID, если `editable: true`, после чего `editable` становится `false`.
- `DELETE /surveys/:id` – удаление опроса по ID.
2. *Функции*:
- `readSurveys` – читает данные из JSON-файла.
- `writeSurveys` – записывает данные в JSON-файл.
### Шаг 4: Запуск проекта
Запустите сервер командой:
```bash
node app.js
```
Теперь API будет доступен по адресу `http://localhost:3000`.