[Feishu-Kanal WebSocket-Modus: client.on ist keine Funktion] - Feishu Channel WebSocket Mode: client.on is not a function
Der Feishu-Kanal stĂŒrzt beim Start mit 'client.on ist keine Funktion' aufgrund eines WebSocket-Client-Initialisierungsfehlers in OpenClaw 2026.2.26 ab.
đ Symptome
PrimĂ€re FehlerĂ€uĂerung
Der Feishu-Kanal wird sofort nach der Initialisierung beendet mit einem TypeError:
[default] channel exited: client.on is not a functionAusfĂŒhrungskontext
Der Fehler tritt wÀhrend der WebSocket-Handshake-Phase auf, wie die Protokollsequenz zeigt:
{"subsystem":"gateway/channels/feishu","1":"starting feishu[default] (mode: websocket)"}
{"subsystem":"gateway/channels/feishu","1":"feishu[${accountId}]: bot open_id resolved: ${botOpenId ?? "unknown"}"}
{"subsystem":"gateway/channels/feishu","1":"[default] channel exited: client.on is not a function"}
{"subsystem":"gateway/channels/feishu","1":"[default] auto-restart attempt 3/10 in 20s"}Diagnostische Beobachtungen
- Bot-IdentitÀtsauflösung erfolgreich: Der
open_id-Protokolleintrag bestĂ€tigt, dass die API-Authentifizierung (appId/appSecret) funktioniert. - Ausgehende Kommunikation nicht betroffen: Das Senden von Nachrichten ĂŒber den Feishu-Kanal funktioniert korrekt.
- Eingehende Verarbeitung defekt: Keine eingehenden Nachrichten von Feishu-Benutzern werden verarbeitet.
- Wiederholungsschleife eingeleitet: Der Kanal tritt in einen kontinuierlichen Neustart-Zyklus mit exponentieller Backoff-Strategie ein.
CLI-Inspektionsbefehle
So diagnostizieren Sie diesen Zustand manuell:
# Check OpenClaw version
openclaw --version
# Expected: OpenClaw v2026.2.26
# Verify Feishu channel configuration
openclaw config get channels.feishu
# View real-time logs (if logging level permits)
openclaw logs --follow --filter feishuđ§ Ursache
Architektonischer Fehlerpunkt
Der Fehler client.on is not a function stammt aus einer falschen WebSocket-Client-Initialisierung im Feishu-Kanal-Adapter. Der Code versucht, Event-Listener an ein Client-Objekt anzuhÀngen, dem die erwartete EventEmitter-kompatible API fehlt.
Fehlersequenz-Analyse
- Kanal-Initialisierung: OpenClaw instanziiert den Feishu-Kanal-Adapter im WebSocket-Modus.
- Client-Erstellung: Der Adapter ruft den WebSocket-Bibliothekskonstruktor auf.
- API-Mismatch: Der Code erwartet ein Standard-WebSocket-Objekt mit `.on(event, handler)`-Methoden, erhÀlt aber entweder:
- Ein rohes HTTP-Client-Antwortobjekt
- Eine unsachgemÀà gewrapptte WebSocket-Verbindung
- Eine WebSocketShim-Instanz mit inkompatibler API-OberflÀche
- Event-Binding-Fehler: Der Aufruf von `client.on('message', handler)` wirft
TypeError: client.on is not a function. - Graceful Termination: Der Kanal fÀngt den Fehler ab und beendet sich mit der gemeldeten Meldung.
Wahrscheinlicher Code-Pfad
Die problematische Initialisierung folgt wahrscheinlich diesem Muster:
// Hypothetische fehlerhafte Implementierung (vereinfacht)
const WebSocket = require('ws');
class FeishuChannel {
async connect(config) {
const wsUrl = await this.obtainWebSocketEndpoint(config);
// BUG: Using WebSocket constructor directly instead of proper connection
const client = new WebSocket(wsUrl); // Returns WRONG object type
// This fails because 'client' is not an EventEmitter
client.on('message', (data) => this.handleMessage(data));
client.on('error', (err) => this.handleError(err));
return client;
}
}AbhÀngigkeitskontext
Die ws-Bibliothek (oder Ăquivalent) sollte ein Objekt mit diesen Methoden zurĂŒckgeben:
on(event: string, listener: Function): thisonce(event: string, listener: Function): thisoff(event: string, listener: Function): thissend(data: string | ArrayBuffer): void
Wenn das zurĂŒckgegebene Objekt .on() nicht besitzt, wurde der Kanal-Adapter zwischen Versionen wahrscheinlich modifiziert, oder eine AbhĂ€ngigkeitsversions-Inkongruenz hat den RĂŒckgabetyp verĂ€ndert.
Versionskorrelation
Die Regression erschien in OpenClaw 2026.2.26, was auf eine kĂŒrzliche Ănderung an Folgendem hindeutet:
- Dem Feishu-Kanal-Adapter-Code
- Einer WebSocket-BibliotheksabhÀngigkeitsversion
- Dem Build/Bundling-Prozess, der die Modulauflösung beeinflusst
đ ïž Schritt-fĂŒr-Schritt-Lösung
Methode 1: OpenClaw downgraden (Sofortige Entlastung)
Wenn sofortige ProduktionsstabilitÀt erforderlich ist, downgraden Sie auf eine funktionierende Version:
# Stop OpenClaw service
sudo systemctl stop openclaw # Linux
# or
launchctl unload ~/Library/LaunchAgents/com.openclaw.plist # macOS
# Install previous stable version
npm install -g openclaw@2026.2.20
# Restart service
sudo systemctl start openclaw
# or
launchctl load ~/Library/LaunchAgents/com.openclaw.plistMethode 2: Auf HTTP-Long-Polling-Modus umschalten (Empfohlen)
Der WebSocket-Modus ist instabil; wechseln Sie als Zwischenlösung zu HTTP-Long-Polling:
{
"channels": {
"feishu": {
"enabled": true,
"dmPolicy": "pairing",
"mode": "polling",
"accounts": {
"default": {
"appId": "cli_a90c15147a38dcb3",
"appSecret": "***",
"botName": "Claw",
"pollingIntervalMs": 30000
}
}
}
}
}Hinweis: Wenn das Konfigurationsfeld mode nicht erkannt wird, fahren Sie mit Methode 3 fort.
Methode 3: Manuellen Patch anwenden (TemporÀre Lösung)
Identifizieren und patchen Sie die Feishu-Kanal-Adapter-Quelldatei:
# Locate the Feishu channel adapter
find /usr/local/lib/node_modules/openclaw -name "feishu*.js" 2>/dev/null
# or
find ~/.openclaw -name "feishu*.js" 2>/dev/null
# Common paths:
# /usr/local/lib/node_modules/openclaw/dist/gateway/channels/feishu/index.js
# ~/.openclaw/plugins/feishu/dist/index.jsWenden Sie den folgenden Patch auf den WebSocket-Initialisierungsabschnitt an:
// BEFORE (buggy):
const ws = new WebSocket(url);
ws.on('message', handler);
// AFTER (patched):
const WebSocket = require('ws');
const ws = new WebSocket(url);
// Verify the client has the expected API, wrap if necessary
if (typeof ws.on !== 'function') {
// Fallback: use EventEmitter-style wrapper
const { EventEmitter } = require('events');
const client = new EventEmitter();
ws.onmessage = (event) => client.emit('message', event.data);
ws.onerror = (event) => client.emit('error', event);
ws.onopen = (event) => client.emit('open', event);
ws.onclose = (event) => client.emit('close', event);
// Replace ws with wrapped client
Object.assign(ws, client);
}Methode 4: WebSocket-Bibliothek-Override erzwingen (Fortgeschritten)
Wenn ein AbhÀngigkeitsversionskonflikt vermutet wird, erzwingen Sie das Laden der korrekten WebSocket-Implementierung:
# Check current ws dependency version
cd /usr/local/lib/node_modules/openclaw
npm ls ws
# Install specific compatible version
npm install ws@8.17.0 --saveZur OpenClaw-Konfiguration hinzufĂŒgen (~/.openclaw/config.json):
{
"feishu": {
"websocketOptions": {
"resolveSocket": true,
"library": "ws"
}
}
}đ§Ș Verifizierung
Fix-Erfolg bestÀtigen
Nach Anwendung einer Lösungsmethode verifizieren Sie, dass der Feishu-Kanal erfolgreich verbindet:
Schritt 1: OpenClaw-Dienst neu starten
# Linux
sudo systemctl restart openclaw
# macOS
launchctl unload ~/Library/LaunchAgents/com.openclaw.plist
launchctl load ~/Library/LaunchAgents/com.openclaw.plist
# Or via PM2 (if using process manager)
pm2 restart openclawSchritt 2: Kanalstatus prĂŒfen
openclaw status --channel feishu
# Expected output:
# feishu[default]: connected
# feishu[default]: mode: websocket # or "polling" if using Method 2
# feishu[default]: uptime: 0d 0h 1mSchritt 3: WebSocket-Verbindung verifizieren (nur WebSocket-Modus)
# Check for active WebSocket connection on port 9000 (default)
lsof -i :9000 | grep openclaw
# or
netstat -tlnp | grep 9000
# Expected: LISTEN or ESTABLISHED stateSchritt 4: Eingehenden Nachrichtenempfang testen
Senden Sie eine Testnachricht von einem Feishu-Benutzer an den Bot:
# Monitor logs for incoming message
openclaw logs --follow --filter "feishu.*incoming"
# Send a message from Feishu app to the bot
# Expected log entry:
# {"subsystem":"gateway/channels/feishu","1":"feishu[default]: incoming message from user ${userId}"}
# {"subsystem":"gateway/channels/feishu","1":"feishu[default]: message processed successfully"}Schritt 5: Keine Neustartschleife verifizieren
# Check process uptime
pm2 list
# or
ps aux | grep openclaw
# Expected: stable uptime without auto-restart entries in logsErwartete erfolgreiche Protokollsequenz
{"subsystem":"gateway/channels/feishu","1":"starting feishu[default] (mode: websocket)"}
{"subsystem":"gateway/channels/feishu","1":"feishu[${accountId}]: bot open_id resolved: ${botOpenId}"}
{"subsystem":"gateway/channels/feishu","1":"feishu[default]: WebSocket connected"}
{"subsystem":"gateway/channels/feishu","1":"feishu[default]: channel ready"}Exit-Code-Verifizierung
# Check that the process is stable (no rapid exit)
echo $?
# Expected: 0 (process running)
# If channel is working, no 'exited' messages should appearâ ïž HĂ€ufige Fehler
- Konfigurations-Caching: OpenClaw kann Kanal-Konfigurationen zwischenspeichern. Starten Sie den Dienst nach KonfigurationsÀnderungen immer neu und löschen Sie `~/.openclaw/cache/`, wenn Probleme fortbestehen.
- Polling-Modus nicht erkannt: Das Konfigurationsfeld `mode: "polling"` existiert möglicherweise nicht in v2026.2.26. PrĂŒfen Sie das Kanal-Schema mit
openclaw config schema channels.feishu, bevor Sie davon ausgehen, dass es funktioniert. - WebSocket-Bibliotheks-Versionskonflikte: Wenn OpenClaw global neben projektlokalen AbhĂ€ngigkeiten installiert ist, kann npm verschiedene `ws`-Versionen auflösen. PrĂŒfen Sie mit
npm ls wsin beiden Kontexten. - Node.js-VersionsinkompatibilitĂ€t: Node v25.6.0 ist ein sehr neues Release. Einige native WebSocket-Addons sind fĂŒr diese Version möglicherweise nicht vorgebaut. ErwĂ€gen Sie die Verwendung von Node v22.x LTS als Workaround.
- macOS ARM64-Build-Artefakte: Auf Apple Silicon können zwischengespeicherte native Module aus x86_64-Builds zu lautlosen Fehlern fĂŒhren. FĂŒhren Sie
npm rebuildnach allen WebSocket-BibliotheksĂ€nderungen aus. - Docker-Umgebungsisolation: Wenn Sie OpenClaw in Docker ausfĂŒhren, stellen Sie sicher, dass die WebSocket-Bibliothek im Container installiert ist, nicht vom Host gemountet. Volume-Mounts können
node_modulesmit inkompatiblen Builds ĂŒberschreiben. - Feishu-API-Rate-Limiting: WĂ€hrend der Neustartschleife können mehrere Wiederverbindungsversuche Feishus API-Rate-Limits auslösen und sekundĂ€re Authentifizierungsfehler verursachen. Begrenzen Sie Neustartversuche oder implementieren Sie Backoff.
- Anmeldedaten-Rotation: Wenn das appSecret kĂŒrzlich auf der Feishu Open Platform rotiert wurde, sind die zwischengespeicherten Anmeldedaten in der Konfiguration möglicherweise veraltet. Geben Sie die Anmeldedaten erneut in die Konfigurationsdatei ein.
- KanalprioritÀtskonflikte: Wenn mehrere Feishu-Konten definiert sind, versucht der Kanal möglicherweise, das falsche Konto zuerst zu initialisieren. Setzen Sie explizit
"defaultAccount": "default"auf Kanalebene.
đ Zugehörige Fehler
Kontextuelle Fehlerreferenzen
EADDRINUSE 9000: WebSocket-Portkonflikt. Zeigt an, dass ein anderer Prozess den Feishu-WebSocket-Gateway-Port verwendet. PrĂŒfen Sie mitlsof -i :9000.WebSocket connection failed: 401 Unauthorized: Die Feishu-App-Anmeldedaten (appId/appSecret) sind ungĂŒltig oder abgelaufen. Verifizieren Sie die Anmeldedaten auf der Feishu Open Platform.Feishu API error: app_access_token invalid: Token-Aktualisierungsfehler. Der Kanal kann kein gĂŒltiges Zugriffstoken erhalten. PrĂŒfen Sie die Systemzeit-Synchronisierung.channel exited: UnhandledPromiseRejection: Async-Initialisierungsfehler im Kanal-Adapter. Kann ein Vorbote desclient.on-Fehlers sein, wenn Promises nicht korrekt behandelt werden.auto-restart loop detected: OpenClaws eingebaute Schutzfunktion gegen schnelle Neustartzyklen. Erscheint nach 10 fehlgeschlagenen Versuchen in 2026.2.26. Verwenden Sieopenclaw debugzum Umgehen.Cannot find module 'ws': Fehlende WebSocket-AbhĂ€ngigkeit. Tritt auf, wennnpm installmit--omit=optionalausgefĂŒhrt wurde. Installieren Sie mitnpm installerneut.ECONNREFUSED: Das Feishu-WebSocket-Gateway ist nicht erreichbar. PrĂŒfen Sie Firewall-Regeln und Proxy-Einstellungen.Historical: feishu channel not starting after v2025.x update: Zuvor dokumentierte Regression mit anderer Fehlermeldung. Weist auf fortbestehende StabilitĂ€tsprobleme mit der Feishu-Kanal-WebSocket-Implementierung hin.