VueJS 3: Wie kann ich To-Do's in einer Datei speichern?

1 Antwort

Innerhalb des Browsers hat JavaScript nur eingeschränkte Rechte, das betrifft insbesondere den Zugriff auf das Dateisystem des Nutzers.

Was du nur mit JS/Vue im Browser machen kannst:

  • Die Daten in den Web Storage oder einen Cookie schreiben
  • Ein BLOB-Objekt erstellen, welches dem Nutzer zur Speicherung vorgeschlagen wird; ungefähr so:
const jsonData = JSON.stringify(data);
const blob = new Blob([jsonData], { type: "text/plain" });

const downloadLink = document.createElement("a");
downloadLink.download = "data.json";
downloadLink.href = window.URL.createObjectURL(blob);

downloadLink.click();

Das Lesen der Datei würde mit einem FileReader klappen. Auch in diesem Fall müsste der Nutzer erst aktiv werden, indem er die Datei für ein Eingabefeld auswählt.

Wenn dir diese Optionen nicht zusagen, müsstest du die Speicherung serverseitig vornehmen. Du kannst dir mit Node.js und Express relativ leicht einen Webserver aufsetzen und dem dann via AJAX-Request die Daten herüberschicken.

Der Request könnte so aussehen:

fetch("/save", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(data)
})
.then(response => console.log(response.status));

und so der Request Handler:

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

app.post("/save", (request, response) => {
  const filePath = __dirname + "data.json";
  const newEntry = JSON.parse(request.body);
  fs.readFile(filePath, "utf8", { flag: "a+" }, (error, data) => {
    if (error) {
      console.log(error);
      return;
    }

    let entries;

    try {
      entries = JSON.parse(data);
    }
    catch (ex) {
      entries = [];
    }

    entries.push(newEntry);
    const json = JSON.stringify(entries);
    fs.writeFile(filePath, json, "utf8", () => {
      response.send("success");
    });
  });
});

Eine Validation der Daten, die vom Browser geschickt werden, ist hierbei noch nicht eingebaut. Darum müsstest du dich selbst kümmern.