Skip to content

Best Practices

Marc Staebler edited this page Mar 25, 2026 · 5 revisions

Best Practices

Tipps, Limits und häufige Fehlerquellen für die UserApp-Entwicklung.


Debugging

Logger statt console.log

Auf dem Server gibt es kein console.log. Nutze den Logger:

var logger = KnuddelsServer.getDefaultLogger();

logger.debug('Debug-Info');       // Niedrigste Stufe
logger.info('Allgemeine Info');   // Standard
logger.warn('Warnung');           // Auffällig
logger.error('Fehler');           // Fehler
logger.fatal('Kritisch');         // Schwerwiegend

Die Log-Ausgabe siehst du über /apps im Channel.

Frontend-Debugging

Im Frontend (www/) funktioniert console.log normal. Nutze die Browser-Entwicklertools im Knuddels-Client (falls verfügbar) oder teste lokal im Browser.


Limits

Externe Kommunikation

Limit Wert
Request-Größe max. 10 kB
Response-Größe max. 50 kB
Gleichzeitige Requests max. 50
Daten-Limit 50 MB pro 10 min
Request-Limit 100 Requests pro 10 min

(Alle Daten-Mengen inkl. Header-Daten)

Persistence

Limit Wert
Persistenz pro Schlüssel max. 102.400 Zeichen

Nachrichten & Events

Limit Wert
sendEvent-Daten (Server ↔ UI) max. 10.000 Zeichen
Öffentliche Nachrichten max. 30 Nachrichten in 15 Sek.
Knuddel-Transfer displayReasonText max. 2.000 Zeichen

UI

Limit Wert
Popup/Overlay Größe 50–1000 px (Breite und Höhe)
KnuddelAmount Dezimalstellen max. 2
GlobalApp-ID Länge 1–25 Zeichen (alphanumerisch)

Rate Limiting

Das Versenden von vielen Nachrichten oder Events in kurzer Zeit kann vom Server gedrosselt werden. Achte auf Datensparsamkeit:

  • Bündle mehrere Datenänderungen in einem Event
  • Verwende Debouncing im Client
  • Sende nur die Daten, die sich tatsächlich geändert haben

Häufige Fehler

"Events werden nicht mehr an den Server geschickt"

Ursache: window.location oder Direktlinks zu anderen HTML-Dateien verwendet.

Lösung: Vermeide window.location und direkte Navigation zu anderen HTML-Dateien, da dadurch der Client-Bezug verloren geht. Nutze stattdessen:

  • Mehrere AppContent-Instanzen für verschiedene Seiten
  • replaceWithAppContent() zum Seitenwechsel
  • Oder ein Single-Page-Konzept mit dynamischem DOM

"Änderungen werden nicht aufgespielt"

Ursache: Cache-Problem nach FTP-Upload auf den Live-Server.

Lösung:

  • Warte nach dem Upload einige Minuten, bis die Dateien synchronisiert sind
  • Klicke dann erneut auf "update/restart" in /apps
  • Nutze Client.includeJS() und Client.includeCSS() statt direkter HTML-Einbindung, um Cache-Probleme zu vermeiden

"App startet nicht unter iOS"

Ursache: Fehlende Apple Developer ID.

Lösung: Trage appleDeveloperId in der app.config ein:

appleDeveloperId = DEINE_APPLE_DEVELOPER_ID

"Serverseitig kein console.log"

Lösung: Nutze den Logger (siehe oben).


Architektur-Tipps

Code aufteilen

Teile deinen Server-Code in mehrere Dateien:

// main.js
KnuddelsServer.require('config.js');
KnuddelsServer.require('commands.js');
KnuddelsServer.require('game.js');
KnuddelsServer.require('persistence.js');

Server-Neustarts berücksichtigen

Der Server kann jederzeit unerwartet herunterfahren. Deine App muss damit umgehen können:

// Innerhalb von var App = { ... };
onAppStart: function() {
    // Zustand aus der Persistence wiederherstellen
    var lastState = KnuddelsServer.getPersistence().getObject('lastState', null);
    if (lastState) {
        // Spiel fortsetzen...
    }
},

onShutdown: function() {
    // Aktuellen Zustand sichern
    KnuddelsServer.getPersistence().setObject('lastState', getCurrentState());
},

Frontend öffnen: Best Practice

Für die meisten Apps ist es üblich, das Frontend zu öffnen, wenn ein Nutzer den Channel betritt oder wenn der AppServer neu startet:

// Innerhalb von var App = { ... };
onUserJoined: function(user) {
    if (user.canShowAppViewMode(AppViewMode.Popup)) {
        var pageData = {
            username: user.getNick(),
            alter: user.getAge()
        };
        var htmlFile = new HTMLFile("index.html", pageData);
        var popup = AppContent.popupContent(htmlFile, 480, 720);
        popup.setResponsive(true);
        user.sendAppContent(popup);
    }
},

Direct Connection – Wann sinnvoll?

Verwende Direct Connection (directConnection in app.config) nur wenn:

  • Niedrige Latenz unbedingt nötig ist (z.B. Echtzeit-Spiele)
  • Große Datenmengen übertragen werden

Vermeide es bei einfachen Apps, da manche Nutzer Verbindungsprobleme damit haben.


Responsives Design

UserApps laufen auf Desktop und mobilen Geräten:

  • Setze immer popup.setResponsive(true)
  • Nutze das Viewport-Meta-Tag: <meta name="viewport" content="width=device-width, initial-scale=1.0">
  • Teste auf verschiedenen Bildschirmgrößen
  • Prüfe immer user.canShowAppViewMode() bevor du UI sendest

Sicherheit

  • Nicknames im Client sanitizen – Zeige Nicknames nie unsanitized in HTML an (XSS-Gefahr)
  • Nutzereingaben validieren – Prüfe serverseitig alle Daten, die vom Client kommen
  • Keine Geheimnisse im Frontend – Der Client-Code ist für Nutzer einsehbar

← Zurück zur Übersicht

Navigation

Einstieg

Kernkonzepte

Features

Tutorials

Referenz & Hilfe

Clone this wiki locally