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