Добавление файла JSON из файла JS в приложение Express - PullRequest
0 голосов
/ 06 ноября 2018

Это учебная борьба, и я, возможно, просто подхожу к этому с неловкой стороны, но руководство ценится. В этом проекте используются только HTML, Node и Express.

У меня есть небольшое приложение, которое должно принимать входящие данные опроса для создания профиля «друга» (по сути, только имя, imgURL и 7 вопросов для ответов на каждое значение 1-5). Я хочу сохранить все объекты Friend с этими свойствами в файле JSON в подкаталоге data, чтобы по мере добавления новых пользователей я мог сравнивать друг с другом объекты.

В моем интерфейсе я хочу пройти по каждой стадии по одной загрузочной карте за раз, поэтому у меня есть файл questions.js, который манипулирует DOM, чтобы начать с имени и imgURL и создать новый объект «Друг», затем переходите по одному вопросу за раз (печать текста вопроса из массива строк) и захватывая выбор радиокнопок (значения 1-5) on("submit"). Конечным результатом является то, что я перебрал все вопросы, взял представленные значения и поместил их в массив «показателей» в другом объекте, получив в результате:

{
    "name": "Ahmed",
    "photo": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/6/005/064/1bd/3435aa3.jpg",
    "scores": [5, 1, 4, 4, 5, 1, 2, 5, 4, 1]
  }

Все это прекрасно работает, и я получаю хорошую навигацию Пользователя по вопросам и новый объект Friend со всеми желаемыми данными, сохраняемыми в связанном файле JS.

Теперь, как, черт возьми, я помещаю этот новый объект Friend в качестве элемента массива в моем файле friends.json? Я вроде как получаю, что мне нужен Ajax-вызов в questions.js, или, может быть, я не в базе, и это относится к app.post маршруту в моем server.js, но пока мои исследования и испытания служили только больше путаницы.

Это может быть идиотский вопрос, но я думаю, что там есть лучшая практика, которую я должен изучить. Любое понимание очень ценится!

1 Ответ

0 голосов
/ 06 ноября 2018

? Выполнение запроса POST с использованием Fetch API

Как вы упомянули, вам необходим маршрут POST на вашем сервере, чтобы справиться с этим.

Ваш интерфейс должен выполнить вызов AJAX POST для этой конечной точки с этим вновь созданным объектом. Вы можете использовать Featch API для этого:

fetch('http://localhost:8080/api/friends', {
    method: "POST",
    headers: {
        "Content-Type": "application/json; charset=utf-8",
    },
    body: JSON.stringify({
        name: "Ahmed",
        photo: "https://media.licdn.com/.../foo.jpg",
        scores: [5, 1, 4, 4, 5, 1, 2, 5, 4, 1],
    }),
});

? Изменить данные в бэкэнде

Затем, если предположить, что это простой пример обучения, у вас есть два варианта:

  • Файл friends.json уже загружен в память в виде массива и просто добавьте в него новый элемент.
  • Загружать, анализировать и сохранять friends.json при каждом запросе.

Если это рабочий сервер, то вы можете рассмотреть возможность использования REDIS, MongoDB или любой другой базы данных, которая соответствует вашим потребностям.

Здесь вы можете увидеть их обоих:

// This will be loaded and parsed already (only used in option 1):
const friends = require("../data/friends.json");

// Only used in option 2:
const fs = require('fs');

// Tell the server to parse JSON bodies in your requests:
const bodyParser = require("body-parser");
app.use(bodyParser.json()); // Support JSON-encoded bodies.

// Get existing friends:
app.post('/api/friends', function(req, res, next) {
    // Option 1, persisted in memory:
    res.json(friends);

    // Option 2, loaded and saved everytime:
    try {
        res.json(JSON.parse(fs.readFileSync("../data/friends.json")));
    } catch(err) {
        // JSON.parse might fail:
        next(err);
    }
});

// Create new friend:
app.post('/api/friends', function(req, res, next) {
    // Option 1, persisted in memory:
    friends.push(req.body); // This should be validated properly!
    res.json(friends);

    // Option 2, loaded and saved everytime:
    try {
        const friends = JSON.parse(fs.readFileSync("../data/friends.json"));
        friends.push(req.body); // This should be validated properly!
        fs.writeFileSync("../data/friends.json", JSON.stringify(friends));
        res.json(friends);
    } catch(err) {
        // JSON.parse or fs.writeFileSync might fail:
        next(err);
    }
});

✨ Рекомендуемый способ использования body-parser

В качестве дополнительного предложения, даже если вы увидите, что body-parser используется как app.use(bodyParser.json()) во многих ресурсах, рекомендуемый способ его использования - добавить его только к маршруту. это актуально для:

Экспресс для конкретного маршрута

Этот пример демонстрирует добавление парсеров тела специально к нужным им маршрутам. В общем, это наиболее рекомендуемый способ использования body-parser с Express.

Итак, в вашем случае вы бы сделали:

const bodyParser = require("body-parser");
const jsonParser = bodyParser.json();

...

app.post('/api/friends', jsonParser, function(req, res, next) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...