Teamdatenbank ohne lowdb, Pfad unabhaengig vom Startverzeichnis
lowdb v7 ist ESM-only, das Projekt ist CommonJS. Der bisherige Umweg ueber eine async IIFE mit await import() hatte zur Folge, dass db bei einem sehr fruehen Request noch undefined sein konnte. Fuer eine Liste von Teamnamen genuegt fs: read/write lesen und schreiben db.json direkt und synchron, die Race-Condition entfaellt und lowdb kann als Abhaengigkeit raus. Die exportierte API bleibt unveraendert, score.js und routes/admin.js brauchen keine Anpassung. Der Pfad zu db.json wird jetzt ueber __dirname aufgeloest statt relativ zum Arbeitsverzeichnis, damit die Datei unabhaengig vom Startverzeichnis immer an derselben Stelle liegt. Fehlt oder bricht die Datei, wird auf eine leere Teamliste zurueckgefallen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
c4325ae8ac
commit
92eb59d2ef
3 changed files with 38 additions and 50 deletions
|
|
@ -1,44 +1,59 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
let db;
|
// Datenbank-Controller
|
||||||
|
// Haelt die Liste der bekannten Teamnamen persistent in db.json vor,
|
||||||
|
// damit sie im Adminpanel als Auswahl-Dropdown angeboten werden koennen.
|
||||||
|
|
||||||
// Import ESM into CJS file using immediately invoked function expression because of missing top-level await in CJS
|
const fs = require('node:fs');
|
||||||
(async () => {
|
const path = require('node:path');
|
||||||
const { LowSync } = await import('lowdb');
|
|
||||||
const { JSONFileSync } = await import('lowdb/node');
|
|
||||||
db = new LowSync(new JSONFileSync('db.json'), { teams: []})
|
|
||||||
})();
|
|
||||||
|
|
||||||
|
// Pfad relativ zum Modul, nicht zum Arbeitsverzeichnis, damit die Datei
|
||||||
|
// unabhaengig vom Startverzeichnis immer an derselben Stelle liegt
|
||||||
|
const dbFile = path.join(__dirname, '..', 'db.json');
|
||||||
|
|
||||||
|
// Liest db.json ein, faellt bei fehlender oder defekter Datei auf eine leere Liste zurueck
|
||||||
|
function read() {
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(fs.readFileSync(dbFile, 'utf-8'));
|
||||||
|
if(!Array.isArray(data.teams)) data.teams = []; // Fehlender oder falscher teams-Key
|
||||||
|
return data;
|
||||||
|
} catch (err) {
|
||||||
|
console.error("db.json konnte nicht gelesen werden, verwende leere Teamliste: ", err.message);
|
||||||
|
return { teams: [] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Schreibt den uebergebenen Datensatz zurueck nach db.json
|
||||||
|
function write(data) {
|
||||||
|
fs.writeFileSync(dbFile, JSON.stringify(data, null, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns all teams from db
|
||||||
function getTeams() {
|
function getTeams() {
|
||||||
db.read();
|
return read().teams;
|
||||||
return db.data.teams
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds passed teamName to db if not already existing
|
// Adds passed teamName to db if not already existing
|
||||||
function addTeam(teamName) {
|
function addTeam(teamName) {
|
||||||
console.log(teamName)
|
const data = read();
|
||||||
db.read();
|
if(!data.teams.includes(teamName) && teamName != "") { // Teamname not in db
|
||||||
if(!db.data.teams.includes(teamName) && teamName != "") { // Teamname not in db
|
data.teams.push(teamName);
|
||||||
db.data.teams.push(teamName);
|
write(data);
|
||||||
db.write();
|
|
||||||
} else { // Teamname already in db
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deletes passed teamName from db if existing
|
// Deletes passed teamName from db if existing
|
||||||
function deleteTeam(teamName) {
|
function deleteTeam(teamName) {
|
||||||
db.read();
|
const data = read();
|
||||||
if(db.data.teams.includes(teamName) && teamName != "") { // Teamname in db
|
if(data.teams.includes(teamName) && teamName != "") { // Teamname in db
|
||||||
db.data.teams.splice(db.data.teams.indexOf(teamName), 1) // Delete corresponding array entry
|
data.teams.splice(data.teams.indexOf(teamName), 1); // Delete corresponding array entry
|
||||||
db.write();
|
write(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns important values from db
|
// Returns important values from db
|
||||||
function getValues() {
|
function getValues() {
|
||||||
db.read();
|
return read();
|
||||||
console.log(db.data)
|
|
||||||
return db.data
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
|
||||||
26
scoreboard/package-lock.json
generated
26
scoreboard/package-lock.json
generated
|
|
@ -14,7 +14,6 @@
|
||||||
"express-ws": "^5.0.2",
|
"express-ws": "^5.0.2",
|
||||||
"hbs": "~4.0.4",
|
"hbs": "~4.0.4",
|
||||||
"http-errors": "~1.6.3",
|
"http-errors": "~1.6.3",
|
||||||
"lowdb": "^7.0.1",
|
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"morgan": "~1.9.1",
|
"morgan": "~1.9.1",
|
||||||
"socket.io": "^4.7.5",
|
"socket.io": "^4.7.5",
|
||||||
|
|
@ -470,20 +469,6 @@
|
||||||
"node": ">= 0.10"
|
"node": ">= 0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/lowdb": {
|
|
||||||
"version": "7.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz",
|
|
||||||
"integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==",
|
|
||||||
"dependencies": {
|
|
||||||
"steno": "^4.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/typicode"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/media-typer": {
|
"node_modules/media-typer": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||||
|
|
@ -858,17 +843,6 @@
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/steno": {
|
|
||||||
"version": "4.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz",
|
|
||||||
"integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/typicode"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/type-is": {
|
"node_modules/type-is": {
|
||||||
"version": "1.6.18",
|
"version": "1.6.18",
|
||||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@
|
||||||
"express-ws": "^5.0.2",
|
"express-ws": "^5.0.2",
|
||||||
"hbs": "~4.0.4",
|
"hbs": "~4.0.4",
|
||||||
"http-errors": "~1.6.3",
|
"http-errors": "~1.6.3",
|
||||||
"lowdb": "^7.0.1",
|
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"morgan": "~1.9.1",
|
"morgan": "~1.9.1",
|
||||||
"socket.io": "^4.7.5",
|
"socket.io": "^4.7.5",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue