Как добавить данные в JSON с указанием индекса c в javascript / nodejs - PullRequest
0 голосов
/ 05 августа 2020

Я выполняю базовую c функцию «Книга посетителей».
Пользователи могут отправить небольшую форму (с тремя входами: имя, сообщение и эмодзи).
Я беру ее с помощью req.body в моем компоненте маршрутизатора. Я использую nodejs с express и bodyparser.

Я хочу хранить эти данные только в JSON, не хочу, чтобы здесь задействовалась никакая база данных. У меня проблемы с методом writeFile , использующим модуль 'fs' . Это работает, но это sh новые данные вне единого массива моего JSON файла.

Знаете ли вы, могу ли я sh попасть внутрь массива? Как метод .pu sh, но с writeFile / appendFile / wathever , который хорошо работает с json файлами. Вот мой код:

app.post (router):

app.post('/visitorBook', async (req, res) => { 
    let formData = {
        name: req.body.name,
        msg: req.body.msg,
        emoji: req.body.emoji
    }
    try {
        console.log(req.body)
        let data = JSON.stringify(formData, null, 2);

        fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
            flag:'a' // this flag specify 'please append it' over 'please override file'
        }
        }, (err) => {
            console.log('error :', err)
        });


        res.redirect('/contact') 
    } catch (error) {
        console.error('/visitorBook route error : ', error)
    }
})

My JSON:

[
    {
        "name": "test1",
        "msg": "test1",
        "emoji": "<i class='fas fa-hippo fa-3x'></i>"
    },
    {
        "name": "test2",
        "msg": "test2",
        "emoji": "<i class='fas fa-hippo fa-3x'></i>"
    }
]


{
  "name": "sd",
  "msg": "sd",
  "emoji": "<i class='fas fa-kiwi-bird fa-3x'></i>"
}

Итак, последний с "sd" в имя и сообщение - это нажатое. Два других написаны мной вручную для тестов readFile.

Надеюсь, я предоставил всю необходимую информацию. Не привык здесь размещать ... Спасибо.

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Я ценю вашу простую попытку, но использование некоторых стандартов может быть для вас намного лучше

Есть несколько стандартных JSON DB для узла, например: Simple JSON DB Узел JSON DB Кроме того, вы можете попробовать SQLite. Я также пробую использовать простой файл JSON в качестве базы данных. Мне предстояло много работы, и мне это тоже удалось. Так что мой совет - использовать некоторые стандартные библиотеки

Кроме того, вам нужно получить данные файла. Разберите его как JSON (Декодирование), внесите изменения и снова сериализуйте его и запишите в файл (Кодирование).

0 голосов
/ 05 августа 2020

[РЕШЕНО]
Благодаря @ Divarrek , мне удалось заставить его работать.
Итак:

Прочтите файл с помощью fs.readFileSyn c.
Затем я сохраняю эти необработанные данные в переменной, анализируя их до JSON.
Затем я помещаю sh их в переменную 'jsonBook', которая представляет собой файл json, временно преобразованный в простой объект-переменная.
Затем я пишу в файл с помощью writeFile, передавая данные как переменную 'parsed', которая содержит JSON .stringified версию моей 'jsonBook'

app.post("/visitorBook", async (req, res) => {
    let formData = {
        name: req.body.name,
        msg: req.body.msg,
        emoji: req.body.emoji,
    };
    try {
        let rawdata = fs.readFileSync("./views/scripts/dataVisitorBook.json");
        var jsonBook = JSON.parse(rawdata);
        let formDataParsed = JSON.stringify(formData, null, 2);
        jsonBook.push(formData);
        let parsed = JSON.stringify(jsonBook, null, 2);
        fs.writeFile("./views/scripts/dataVisitorBook.json", parsed, (err) => {
            if (err) throw err;
            console.log("saved");
        });
        res.redirect("/contact");
    } catch (error) {
        console.error("/visitorBook route error : ", error);
    }
});

Надеюсь, я был ясен. Возможно, я допустил ошибку в объяснении, я стараюсь изо всех сил.

0 голосов
/ 05 августа 2020

Если вы прочитаете из существующего файла и проанализируете его с помощью JSON.parse, вы действительно сможете использовать Array.push в нем. А затем вы можете записать преобразованный в строку результат обратно в файл:

fs.readFile("./views/scripts/dataVisitorBook.json", function (err, data) {
  if (err) throw err;
  let data = JSON.parse(data.toString('utf8'));

  data = JSON.stringify(data, null, 2);

  fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
      flag:'a' // this flag specify 'please append it' over 'please override file'
  }
  }, (err) => {
      console.log('error :', err)
  });
})

Это может быть не оптимальным, так как это может занять больше времени по мере увеличения файла.

...