Добавить несколько записей JSON при отправке данных Express - PullRequest
0 голосов
/ 23 сентября 2019

Цель:

Когда я отправляю данные 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);
            }
        }
    });

1 Ответ

0 голосов
/ 30 сентября 2019

По сути, мне пришлось переписать функцию и создать нового друга, который принимает представленную информацию.Переданная информация будет затем помещена в текущий объект JSON и затем присоединена.

       let newFriend = req.body; //STORING INCOMING JSON

       // PUSHING NEW MATCH INTO JSON
       friendsJSON.push(newFriend);
       fs.writeFile(path.join(__dirname + '/../data', 'friends.json'), JSON.stringify(friendsJSON, null, 2), function(err){
           if (err) throw err;
       })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...