Цель:
Когда я отправляю данные JSON, я бы хотел, чтобы данные правильно форматировались при достижении файла JSON независимо от того, сколько записей я отправляю.
Проблема:
До сих пор, когда я отправляю данные, они не добавляются должным образом в файл JSON;например, это добавляется так:
{
"name": "Jay Money",
"photo": "/photo/url",
"scores": [
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5"
]
}{
"name": "Jay Money",
"photo": "/photo/url",
"scores": [
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5"
]
}
Мне бы хотелось, чтобы при добавлении материалов это выглядело так:
[{
"name": "Jay Money",
"photo": "/photo/url",
"scores": [
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5"
]
},
{
"name": "Jay Money",
"photo": "/photo/url",
"scores": [
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5",
"5"
]
}]
Я все еще исследую, но мне не повезлоЯ просто ищу руководства.
Вот как выглядит мой файл server.js:
// Dependencies
let express = require("express");
let bodyParser = require("body-parser");
let path = require("path");
let fs = require("fs");
// Set the port of our application
// process.env.PORT lets the port be set by Heroku
let PORT = process.env.PORT || 4000;
// Create express app instance.
let app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
// Routes
// TODO Add your routes here
app.get('/', function(req,res){
res.sendFile('home.html', {root : __dirname + '/app/public'});
});
app.get('/survey', function(req, res){
res.sendFile('survey.html',{root : __dirname + '/app/public'} )
});
app.post('/surveyResponse', function(req,res){
let photo = req.body.url;
let name = req.body.name;
let travel = req.body.travel;
let affection = req.body.affection;
let family = req.body.family;
let fitness = req.body.fitness;
let movie = req.body.movie;
let education = req.body.education;
let career = req.body.career;
let marriage = req.body.marriage;
let children = req.body.children;
let pets = req.body.pets;
let sum = 0;
let person = {
name: name,
photo: photo,
scores: [
travel,
affection,
family,
fitness,
movie,
education,
career,
marriage,
children,
pets
]
}
let data = JSON.stringify(person, null ,2);
fs.appendFileSync('./app/data/friends.json', data);
//finding the sum of all the numbers
for(i in person.scores){
sum+=Number(person.scores[i]);
}
//------------------------------------
res.send('Your name is ' + name + ' and your score is ' + sum );
});
// Start our server so that it can begin listening to client requests.
app.listen(PORT, function() {
// Log (server-side) when our server has started
console.log("Server listening on: http://localhost:" + PORT);
});
Это код, который я использую для добавления:
let data = JSON.stringify(person, null ,2);
fs.appendFileSync('./app/data/friends.json', data);
РЕДАКТИРОВАТЬ:
Мне известно о Как добавить данные JSON в существующий файл JSON node.js , и это не решает мою проблему.Когда я пытался включить код в свой код как таковой:
var data = fs.readFileSync('friends.json');
var json = JSON.parse(data);
json.push(...person);
fs.writeFile("friends.json", JSON.stringify(json))
Я получал следующее сообщение об ошибке:
SyntaxError: Неожиданный конец ввода JSON
Итак, я попробовал новый вариант, который удалял ...
из json.push
, поэтому он выглядит так json.push(person)
.
Но я продолжаю получать одно и то же сообщение об ошибке.Я предполагаю, потому что мой файл пуст, это вызывает ошибку.Я предполагаю, что сначала мне нужно написать код, а затем предпринять следующие шаги.
Обновление
Я нашел то, что, как мне кажется, выводит меня на правильный путь ( Сохранить данные html-формы в формате json в файле .json с помощью узла и выразить с помощью javascript ) Кажется, я не могу интегрировать их в мой код.Я не могу понять, почему я получаю следующую ошибку:
SyntaxError: Неожиданный конец ввода JSON в JSON.parse () в fs.readFile (server.js: 86: 39) в FSReqWrap.readFileAfterClose [as oncomplete] (fs.js: 511: 3)
Вот мой новый код, с которым я работаю:
// 1. Read the existing file
fs.readFile('./app/data/friends.json', (err, data) => {
if (err && err.code === "ENOENT") {
// But the file might not yet exist. If so, just write the object and bail
return fs.writeFile('./app/data/friends.json', JSON.stringify(person), error => console.error);
} else if (err) {
// Some other error
console.error(err);
}
// 2. Otherwise, get its JSON content
else {
try {
const fileData = JSON.parse(data);
// 3. Append the object you want
fileData.push(person);
//4. Write the file back out
return fs.writeFile('./app/data/friends.json', JSON.stringify(fileData), error => console.error)
} catch (exception) {
console.error(exception);
}
}
});