#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. Спасибо за вашу помощь!