Ошибки при сохранении данных JSON — NodeJS Express

#node.js #arrays #json #express

#node.js #массивы #json #экспресс

Вопрос:

У меня возникла проблема с сохранением и доступом к моим данным JSON, все объекты в файле JSON преобразуются в строку, четные числа.

Вот мой экспресс-маршрут к GET данным из HTML FORM

 control.post('/like/:id',getuserdata, async (req, res, next) => {
    try{
        let likedata = './bin/like/likedata.json'
        let title = res.accountuser.title;
        let pass = res.accountuser.password;
        let tags = req.body.likes;
        let actions = req.body.action;
        let like =  {
            username: title,
            password: pass,
            tag: tags,
            times: actions,
        }
        
        let jsonlike = JSON.stringify(like)
        fs.appendFileSync(likedata, jsonlike)
        next();
        res.redirect('/dashboard')
        } catch (err){
            console.log(err)
        }
});
  

Вот как выглядит мой файл JSON, когда я добавляю значение дважды или более, файл JSON показывает ошибки End of file expected.

 {"username":"account1","password":"somepass1","tag":"hello","times":"5"}{"username":"account2","password":"somepass2","tag":"helllo","times":"444"}
  

Я хочу использовать эти данные JSON по отдельности, здесь:

 const ig = require('./like');
var cron = require('node-cron');

const iglike = async() => {

   await ig.initialize();

   await ig.login(username, password); //here

   await ig.liketagsprocess(tag, times); //here

};
cron.schedule('* */4 */12 * * *', function() {
   iglike();
});

module.exports = iglike;

  

Как я могу это сделать?

Ответ №1:

То, что вы записываете в файл JSON, вообще не является допустимым JSON.

 // Contents of your file

{"username":"account1","password":"somepass1","tag":"hello","times":"5"}{"username":"account2","password":"somepass2","tag":"helllo","times":"444"}
  

Попробуйте эту структуру, которая представляет собой массив объектов JSON:

 [{"username":"account1","password":"somepass1","tag":"hello","times":"5"}, {"username":"account2","password":"somepass2","tag":"helllo","times":"444"}]
  

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

Также вам, вероятно, следует попытаться свести к минимуму операции чтения / записи, appendFileSync() это блокирующая операция, вы можете загрузить действительный JSON файл с помощью require и работать над этим, а также периодически пытаться обновлять содержимое в файле, перезаписывая его текущее состояние массива объектов JSON.

Скопируйте и вставьте приведенный ниже код в файл с именем app.js и запустите, введя node app.js , проверьте console.log() выходные данные и json созданные файлы. Результаты говорят сами за себя.

 const like = require('./like.json');
const fs = require('fs');

const init = () => {
    console.log(like);
  
    let likedata = [
        {
            "hello": "world",
            "one": 1
        }, 
        {
            "hi": "there",
            "two": 2
        }
    ];

    let likedatastr = [
        {
            "hey": "whatsup",
            "three_str": "3"
        }
    ];

    let likedatamod = [
        {
            "hey": likedatastr[0].hey,
            "three_int": parseInt(likedatastr[0].three_str)
        }
    ]
    fs.writeFileSync('./likedata1.json', likedata);
    fs.writeFileSync('./likedata2.json', JSON.stringify(likedata));
    fs.writeFileSync('./likedatastr.json', JSON.stringify(likedatastr));
    fs.writeFileSync('./likedatamod.json', JSON.stringify(likedatamod));

};

init();

  

И like.json , как показано ниже:

 [{"username":"account1","password":"somepass1","tag":"hello","times":"5"}, {"username":"account2","password":"somepass2","tag":"helllo","times":"444"]
  

Аналогичным образом, убедитесь, что числа действительно являются числами в данных, которые вы извлекаете из тела запроса. В идеале вы должны указать parseInt() (при условии, что вы ожидаете целых чисел) данные тела запроса, которые, как вы ожидаете, будут числами, и обработать NaN на всякий случай!

Удачи.

Комментарии:

1. Спасибо за вашу помощь!