Hoe JSON-bestanden lezen en schrijven in Node.js
Het is mogelijk om JSON-bestanden te lezen en te schrijven in Node.js. Je hoeft alleen maar de fs-module te gebruiken, zoals beschreven in onze eenvoudig te volgen handleiding.
JSON-bestanden lezen en schrijven in Node.js
De JavaScript Object Notation (JSON) is een veelgebruikte standaard voor gegevensoverdracht, vooral bekend om zijn vermogen om georganiseerde informatie op een beknopte manier weer te geven. Dit formaat, dat wordt gekenmerkt door zijn tekstuele aard, vergemakkelijkt moeiteloos begrip bij menselijke gebruikers, terwijl het ook naadloos parseren en genereren door machineverwerkingssystemen mogelijk maakt.
Het gebruik van de capaciteit voor geautomatiseerd parsen en genereren van JSON-gegevens in Node.js maakt efficiënte en moeiteloze opslag, overdracht en manipulatie van gestructureerde informatie mogelijk. Krijg een uitgebreid begrip van het lezen, samenstellen en wijzigen van JSON-bestanden door het gebruik van de Node.js bestandssysteemcomponent.
De Node.js bestandssysteem module
De Node.js bestandssysteem module, die inherent is opgenomen in de Node.js omgeving, stelt gebruikers in staat om te communiceren met het bestandssysteem van hun apparaat door middel van verschillende functionaliteiten, zoals het lezen van bestanden, het creëren van nieuwe bestanden en het verwijderen van bestanden, onder anderen.
De functionaliteiten die worden aangeboden door de bestandssysteemmodule zijn beschikbaar in twee verschillende modaliteiten; ze kunnen asynchroon of synchroon worden uitgevoerd. Asynchrone bewerkingen belemmeren de voortgang van je applicatie niet omdat ze gelijktijdige verwerking met andere taken mogelijk maken. Methoden die dit patroon volgen, dragen meestal een aanduiding die hun asynchrone aard aangeeft. Je vindt bijvoorbeeld aanduidingen als “Async” of “await” toegevoegd aan de naam van de methode, bijv. readFileAsync
of writeFileAsync
.
Terwijl synchrone methoden de uitvoering van het programma opschorten tot de bewerking van het bestandssysteem is voltooid, staan asynchrone methoden het programma toe om gelijktijdig verder te gaan met andere taken door gebruik te maken van een terugbelfunctie die wordt uitgevoerd zodra de bewerking is voltooid. Illustratieve voorbeelden zijn de functies readFile en writeFile.
Om de niet-blokkerende karakteristiek van de gebeurtenislus te behouden en de algehele efficiëntie en snelheid van een applicatie bij het omgaan met bestanden te verbeteren, is het noodzakelijk om asynchrone technieken te gebruiken in alle interacties met het bestandssysteem.
In specifieke gevallen waar eenvoud van het grootste belang is en de bewerking niet vaak voorkomt, zoals bij basisscripttaken of bestandsmanipulaties voor eenmalig gebruik, zijn asynchrone benaderingen mogelijk niet nodig en kunnen synchrone technieken een efficiënte oplossing zijn.
JSON-bestanden lezen met de fs-module
Om een JSON-bestand te verwerken met asynchroon JavaScript, is het nodig om de asynchrone bestandssysteemmodule te importeren in het primaire scriptbestand. Dit kan worden bereikt door een importstatement aan het begin van het bestand op te nemen, zoals hieronder wordt geïllustreerd:
const fs = require("node:fs/promises");
Als een versie van Node.js wordt gebruikt die ouder is dan versie 18, moet de fs-module op de volgende manier worden geïmporteerd:
const fs = require("fs/promises");
Als men de volledige module wil importeren, inclusief zowel synchrone als asynchrone componenten, is het noodzakelijk om de “/promises” weg te laten uit het import statement.
Met behulp van de functie readFile
kan de inhoud van een JSON-bestand worden bekeken door zowel een directorypad als een optioneel configuratieobject als parameters mee te geven. Dit configuratieobject kan een JavaScript-object zijn dat verschillende leesvoorkeuren bevat of een tekenreeks die een vooraf bepaald coderingsschema inkapselt.
De objectopties omvatten:
De gespecificeerde parameter bepaalt de tekenset die wordt gebruikt tijdens het doornemen van een bepaald document, waarbij de standaardconfiguratie “utf8” is, die meestal wordt gebruikt voor tekstuele inhoud en “binair” dat van toepassing is op niet-tekstgegevensbestanden.
Het asterisk (*) symbool gevolgd door haakjes, ingesloten tussen accolades ({}), geeft een optioneel argument aan dat standaard de waarde “r” heeft, wat staat voor leesmodus bij het openen van een bestand in een specifiek bestandssysteem. Andere veelgebruikte toegangsmodi voor bestanden zijn “w” voor alleen-schrijfmodus en “a” voor append-modus.
Bijvoorbeeld:
fs.readFile("./users.json", { encoding: "utf-8", flag: "r" })
.then((data) => {
const users = JSON.parse(data);
console.log(users);
})
.catch((error) => {
console.error('Error reading the JSON file:', error);
});
De huidige applicatie is ontworpen om informatie te verwerken die is opgeslagen in een bestand met de naam “users.json”, dat zich in de directe omgeving van het uitvoeringspunt van de software bevindt. Om de inhoud van dit bestand te extraheren, kan gebruik worden gemaakt van de ingebouwde functionaliteit van de gebruikte programmeertaal. Specifiek kan de methode “JSON.parse” worden aangeroepen om de opgehaalde gegevens om te zetten in een JavaScript-object. Door dit te doen, krijgt de gebruiker de mogelijkheid om te interageren met de informatie die het bevat en deze aan te passen, allemaal binnen de grenzen van hun codebase.
Bij kleinere JSON-bestanden kan de functie require
worden gebruikt om dergelijke bestanden synchroon te parsen en hun inhoud om te zetten in JavaScript-objecten. Voor omvangrijkere JSON-bestanden of bij het werken in een asynchrone context wordt echter aangeraden om in plaats daarvan de methode fs.readFile
te gebruiken.Het is belangrijk om op te merken dat de
benadering de mogelijkheid heeft om de volledige inhoud van het bestand in het geheugen op te slaan, wat tot problemen kan leiden als de JSON gegevens vaak worden gewijzigd.
JSON-bestanden schrijven met de fs-module
Met de functie writeFile
kunnen gegevens in JSON-indeling worden gemaakt en geschreven door drie parameters op te geven, namelijk het bestandspad, de gegevens die moeten worden geschreven en een optionele callback-functie.
⭐A bestandspad.
De informatie die bedoeld is voor opslag in een bestand kan verschillende vormen aannemen, zoals een string, een buffer, een asynchrone iterable of een iterable object.
⭐Een optioneel configuratieobject.
Deze specifieke benadering maakt gebruik van asynchrone bewerkingen om gegevens naar een gespecificeerd bestand te schrijven. In gevallen waarin het genoemde bestand al bestaat, wordt de huidige inhoud vervangen door de verstrekte gegevens, waardoor alle eerdere informatie die erin is opgeslagen wordt vervangen. Omgekeerd, in gevallen waarin het bestand nog niet bestaat, zal deze techniek het bestand aanmaken en het vervolgens vullen met de gegevens die als invoer zijn doorgegeven, en er zo voor zorgen dat alle benodigde informatie met succes wordt opgeslagen in de aangewezen opslaglocatie.
Bijvoorbeeld:
const fakeUsers = [
{
id: 1,
name: "John Doe",
username: "johndoe123",
address: {
street: "123 Main St",
city: "Anytown",
},
},
{
id: 2,
name: "Jane Smith",
username: "janesmith456",
address: {
street: "456 Elm St",
city: "Another City",
},
}
];
fs.writeFile("./users.json", JSON.stringify(fakeUsers), {
encoding: "utf-8",
flag: "w",
}).catch((error) => {
console.error('Error writing the JSON file:', error);
});
een string of een buffer. Als je een object wilt opslaan in dat bestand, moet je het eerst transformeren naar een string door gebruik te maken van de JSON.stringify methode.
JSON-bestanden bijwerken met de fs-module
De meegeleverde code biedt geen directe methode voor het wijzigen van bestanden, omdat schrijven naar een bestand de vorige inhoud wist.
Om dit probleem op te lossen, kan de bestaande inhoud van het bestand worden opgehaald met de functie readFile
. Vervolgens kan men de bijgewerkte gegevens aan elkaar rijgen met de opgehaalde informatie en beide datasets aanleveren als invoer voor de bewerking writeFile
.
Zeker, hier is een voorbeeld van een functie in Python die de geschetste logica belichaamt:
const updateFile = async (filePath, data) => {
try {
const fileContents = await fs.readFile(filePath, {
encoding: "utf-8",
flag: "r",
});
const fileData = JSON.parse(fileContents);
const updatedFileData = [...fileData, ...data];
await fs.writeFile(filePath, JSON.stringify(updatedFileData), {
encoding: "utf-8",
flag: "w",
});
return "File updated successfully";
} catch (error) {
console.error('Error updating the JSON file:', error);
}
};
Je kunt de functie als volgt aanroepen:
updateFile("./users.json", [
{
id: 4,
name: "Jane Doe",
username: "janedoe123",
address: {
street: "123 Main St",
city: "Anytown",
},
},
{
id: 5,
name: "John Smith",
username: "johnsmith456",
address: {
street: "456 Elm St",
city: "Another City",
},
}
]).then((message) => {
console.log(message);
});
Dit codefragment voegt de gegevens van de genoemde gebruikers toe aan een bestaand JSON-bestand met de naam “users.json”.
Beveiligingsoverwegingen voor het lezen en schrijven van JSON-bestanden
Het waarborgen van de beveiliging van een Node.js-applicatie die JSON-bestanden verwerkt is van het grootste belang, omdat dergelijke acties kritieke aspecten van beveiliging met zich meebrengen.Het is essentieel om de geldigheid van de JSON-gegevens te verifiëren om naleving van vooraf gedefinieerde specificaties te garanderen. Daarnaast zijn het beperken van toegangsrechten voor bestanden en het opschonen van gebruikersinvoer effectieve maatregelen tegen potentiële bedreigingen zoals code-injectie-aanvallen.