Как не дублировать данные при использовании файла fs.WriteFile?

#node.js #fs

#node.js #fs

Вопрос:

Я пытаюсь получить некоторые данные из простой формы и записать JSON-файл, используя node JS и FS. Мне это нужно:

 [{"id":1,"answer1":"C","answer2":"C"},{"id":2,"answer1":"A","answer2":"A"}]
 

Это код, который я написал:

 const express = require("express");
const fs = require('fs');

const app = express();

const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({
     extended: true
}));

app.get("/", function(req, res) {
     res.sendFile(__dirname   "/form.html")
});

app.post("/", function(req, res) {

     let result1 = req.body.question1;
     let result2 = req.body.question2;

     const dataFile = require("./data.json");
     const userAnswers = {
          id: dataFile.length   1,
          answer1: result1,
          answer2: result2,
     };

     dataFile.push(userAnswers);


     fs.writeFile("data.json", JSON.stringify(dataFile), 'utf8', function(err) {
          if (err) {
               console.log("An error occured while writing JSON Object to File.");
               return console.log(err);
          }

          console.log("JSON file has been saved.");

     });

     res.sendFile(__dirname   "/form.html");
});


app.listen(3000, function() {
     console.log("The server is running on 3000")
});
 

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

Проблема в том, что когда я обновляю страницу, последний ввод дублируется в моем JSON-файле. Я не знаю, как его сбросить. Может кто-нибудь мне помочь?

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

1. Обратите внимание, что когда вы получаете ошибку при обработке запроса, вы ДОЛЖНЫ отправить некоторый тип ответа на входящий запрос. Вы можете сделать res.sendStatus(500) , если вам нечего лучше отправить.

Ответ №1:

Похоже, что ваше обновление повторно отправляет предыдущие данные (некоторые браузеры запрашивают вас перед этим).

Вы могли бы помешать этому, заменив:

 res.sendFile(__dirname   "/form.html"); 
 

в вашем app.post() обработчике с этим:

 res.redirect("/");
 

Отображение конечного пользователя останется прежним, но обновление на этой странице больше не может повторно отправить предыдущую запись формы. Это просто перезагрузит форму без каких-либо других побочных эффектов.