Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

### Структура проекта

``` 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`.



Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: