JavaScript JSON db online speicher und importieren?

shoa66

Ensign
Dabei seit
Mai 2005
Beiträge
243
Hey zusammen,

habe aktuell ein paar Scripte die mit einer Datenbank im JSON Format arbeiten (viele Objekte in einem Array). Aktuell ist diese Datenbank in jedem Node.js script hardcoded, d.h. bei jeder Änderung muss ich alle Scripte auf allen Servern anpassen/editieren.

Daher wäre es wünschenswert das nur einmal an einer zentralen Stelle zu editieren und die Scripte bzw. Worker holen sich die Daten dann von dort.

Meine erste Idee, die ich aber selbst reichlich unelegant finde, wäre: Webserver aufsetzen, die Daten dort z.B. in einer .json oder .txt Datei hinterlegen (sind keine sensiblen Daten, trotzdem wäre es mir irgendwo, wo es nicht öffentlich wäre, doch lieber), diese via Node.js herunterladen und als JSON parsen und dann als Variable damit weiterarbeiten.

Bevor ich das aber so suboptimal löse wollte ich mir mal die Meinung von erfahreneren Programmierern holen und fragen wie ihr das so lösen würdet. Sicherlich ist eine Datenbank im JSON Format einer eher ungewöhnlichere Lösung, aber für meinen Zweck eben völlig ausreichend.

Wie löse ich es am idealsten? Am besten wäre eine Lösung, bei der ich die Daten online mit einem Editor aus dem Browser heraus gleich editieren könnte (falls es sowas schon für Enduser gibt).

Besten Dank vorab!
 
Zuletzt bearbeitet:

Bagbag

Commodore
Dabei seit
Mai 2011
Beiträge
4.162
Nur weil du die Daten per HTTP verteiltst, müssen sie ja nicht öffentlich sein. Du kannst das ganze auch mit bspw basic auth absichern.

Ansonsten könntest du dir noch ein kleines Skript basteln, dass sich automatisch zu allen Servern verbindet, das deployment durchführt (im einfachsten Fall einfach ein git pull) und node neustartet.

Wenn es Linux server sind, könntest du das ganze in ein Image packen und über einen docker swarm deployen. Dann baust du einmal das Image und docker startet automatisch auf allen Server neue Container.

Du könntest das ganze mit etwas wie Syncthing automatisch auf gleichem Stand halten.

Du könntest eine NFS/SFTP/whatever Freigabe machen und den Ordner mit der Datei bei allen einbinden.

Und sicher noch viele, viele andere Möglichkeiten.
 

Lukas'

Lt. Junior Grade
Dabei seit
Aug. 2013
Beiträge
285
Wenn alle Skripte auf einem Server laufen, würde ich den JSON in eine Datei auf dem PC legen. Die Node Skripte würde ich dementsprechend anpassen, dass sie je nach Wunsch diese Datei einmalig bei Neustart, regelmäßig oder immer bei Zugriff einlesen.
Wenn deine Skripte verteilt liegen, kommst du nicht drum herum, deinen JSON irgendwie einzulesen. Wie @Bagbag schon meinte, ist das grundsätzlich kein Problem mit der Absicherung. Ich kann mir jedoch nicht vorstellen, dass das sehr performant ist und es wirkt etwas pfuschig. Wenn es den Aufwand rechtfertigt, würde ich auf eine einfache Datenbank wie MongoDB zurückgreifen. Dabei aber nicht nur einen Eintrag "JSON" einpflegen, sondern die Schlüssel:Wert Paare in die Datenbank übernehmen. Dort kannst du dann auch zentral Änderungen durchführen.
 

Bagbag

Commodore
Dabei seit
Mai 2011
Beiträge
4.162
Naja, das abholen per HTTP und einlesen wird wohl nur ein paar ms dauern, wenn das nur beim start oder alle 5 minuten oder so passiert, wie das der Performance sicher kein Bein brechen, zumal das schön im Hintergrund passieren kann.

Eine MongoDB einzurichten ist hier doch wohl eher overkill. Auf mich wirkt dass so, als werden die Daten alle paar Tage mal bearbeitet.

Ich finde die Lösung über HTTP mit die beste im Gesamtpaket. Das ist ja dann praktisch einfach eine API.
 

shoa66

Ensign
Ersteller dieses Themas
Dabei seit
Mai 2005
Beiträge
243
Danke schon mal für die Antworten. Noch ein paar weitere Infos:

1. Die Skripte laufen auf mehreren, verschiedenen Servern. Daher ja die Problematik.
2. Ich bearbeite manche Daten nur 1-2x pro Tag.
3. Mein Plan war die Daten via SetInterval ca. alle 30 Minuten neu einlesen, also Performance usw. sollte da keine Rolle spielen.
4. MongoDB empfinde ich auch als Overkill

Ich hatte es mal kurz, als lokale Zwischenlösung, via

Code:
var database = require('./database.js').data;
probiert und das klappt auch super, nur klappt das Überschreiben der Daten via SetInterval irgendwie nicht. Scheinbar wird require nur einmalig beim ersten Start ausgeführt?
 

Bagbag

Commodore
Dabei seit
Mai 2011
Beiträge
4.162
ja, require wird einmalig beim starten ausgeführt. Das passende hier ist dann fs.readFile, gefolgt von JSON.parse per setInterval.
 

shoa66

Ensign
Ersteller dieses Themas
Dabei seit
Mai 2005
Beiträge
243
Alles klar, danke, hatte ich mir tatsächlich auch schon überlegt :D

Bin jetzt aktuell an folgendem dran: Die Datenbank habe ich in nem privaten Git Repository geparkt, den Link zum RAW code (ist dank database.js?token=xxxxx in der URL auch ohne cookie abzurufen) hole ich in den scripts via request lib ab, und das wiederhole ich via setInterval.

So muss ich keinen extra Webserver aufsetzen und mich nicht darum kümmern mit der request lib an Daten hinter nem htaccess zu kommen (so hätte ich sie dann vermutlich geschützt), falls das mit request überhaupt ginge.

Einziges verbleibendes Problem ist jetzt, dass ich JSON.parse nicht nutzen kann, da meine Datenbank nur eine Variable mit einem Array aus Objekten ist.

Code:
var database = [
    {name:"item1", price:18.5, isSpecial:true},
    {name:"item2", price:225},
];
Gibt es eine Möglichkeit einfach aus einem String einfach ein Objekt zu bauen - oder eine andere Möglichkeit?

Würde ungern die ganze Datenbank umbauen :(
 

shoa66

Ensign
Ersteller dieses Themas
Dabei seit
Mai 2005
Beiträge
243
Falls du es so meintest:

Code:
[
    {name:"item1", price:18.5, isSpecial:true},
    {name:"item2", price:225},
];
Geht es leider trotzdem nicht:

SyntaxError: Unexpected token n in JSON at position 4
Sorry falls du es anders gemeint hast und ich auf dem Schlauch stehe :/

/edit: Hab mir jetzt doch nen JSON gebaut, ging mit Search & Replace doch schneller als gedacht, und es geht trotzdem nicht.

Das Problem: Meine Datenbank ist in UTF-8 und die Zeichen müssen auch erhalten bleiben. Sobald ich die File auf ANSI stelle, klappt es auch.

Gibt es irgendeinen Weg parseJson mit UTF-8 zu nutzen, so das alle Zeichen erhalten bleiben und mitgeparst werden?
 
Zuletzt bearbeitet:

Bagbag

Commodore
Dabei seit
Mai 2011
Beiträge
4.162
UTF8 ist eigentlich kein Problem.
In deinem Beispiel muss am Ende das ";" weg und die keys in Anführungszeichen.

Tipp: nimm deine Ursprungs js Datei und mach console.log(JSON.stringify(database, null, 2))
 

Bagbag

Commodore
Dabei seit
Mai 2011
Beiträge
4.162
Poste hier mal den relevanten Code (fertig zum ausführen) und eine Beispieldatei (als Anhang).
 

shoa66

Ensign
Ersteller dieses Themas
Dabei seit
Mai 2005
Beiträge
243
Hat sich schon erledigt, hab dank deinem Hinweis dass es eigentlich gehen müsste nochmal Motivation gefunden und den JSON komplett neu angelegt/portiert. Nur diesmal in Visual Studio Code (statt Nodepad++) und mit dieser File lief dann alles (obwohl Visual Studio Code die File auch auf UTF-8 gestellt hat (die Files von Nodepad waren UTF-8 BOM sehe ich grad) 😕

Ich kann wirklich nicht sagen was da los war, bin aber heilfroh dass es jetzt läuft.

Jetzt gibt es nur noch ein Problem: Wo soll ich die File sicher parken?

Gibt es bei Github bei nem private Repository ne Möglichkeit nen dauerhaften Token zu erstellen? Die Links sehen da ja wie folgt aus

nur ändert sich der Token ca. alle 10 Minuten. Wäre ideal wenn ich mir die .json direkt von git holen könne, dann spare ich es mir nen Webserver aufzusetzen.
 
Zuletzt bearbeitet:

Bagbag

Commodore
Dabei seit
Mai 2011
Beiträge
4.162
Ich weiß nicht, ob es das bei GitHub auch gibt, aber bei GitLab kann man deploy-tokens erstellen. Die sind dann dauerhaft gültig.
 
Top