Socket.io-client: Nicht erkannte WebSocket-Verbindungsoption (en) "Agent", "PerMessageDeflate", "Pfx", "Schlüssel", "Passphrase", "Zertifikat", "Ca", "Chiffren", "Ablehnen nicht autorisiert". Wollten Sie diese unter "Überschriften" setzen?

Erstellt am 15. Apr. 2019  ·  49Kommentare  ·  Quelle: socketio/socket.io-client

Du möchtest:

  • [x] einen Fehler melden
  • [] fordere eine Funktion an

Aktuelles Verhalten

Wenn ich socket.io-client in einem leeren React Native Expo-Projekt installiere, wird eine gelbe Meldung angezeigt mit:

Unrecognized WebSocket connection option(s) `agent`, `perMessageDeflate`, `pfx`, `key`, `passphrase`, `cert`, `ca`, `ciphers`, `rejectUnauthorized`. Did you mean to put these under `headers`?

Schritte zum Reproduzieren (wenn das aktuelle Verhalten ein Fehler ist)

yarn add socket.io-client

In App.js im React Native-Projekt:

import React from 'react';
import { YellowBox } from 'react-native';
import io from 'socket.io-client';

YellowBox.ignoreWarnings(['Remote debugger']);

import AppContainer from './config/routing';

export default class App extends React.Component {
    constructor(props) {
        super(props);
    }

    componentWillMount() {
        const socket = io('http://10.0.60.26:3000', {
            forceNew: true
        });
        socket.on('connect', () => console.log('Connection'));
    }

    render() {
        return <AppContainer />;
    }
}
bug

Hilfreichster Kommentar

Bei mir hat es funktioniert, als ich auf 2.1.1 heruntergestuft habe:
yarn add [email protected]

Zuerst hat es nicht funktioniert, weil ich das Symbol ^ vor der Version socket.io-client@^2.1.1 hinzugefügt habe,

Alle 49 Kommentare

Gleiches Problem :(

+1

+1

+1

Scheint seit mindestens dem 18. Dezember ein Problem

+1

+1

+1

+1

Ich erhalte immer noch diese Warnung, wenn ich socket.io (2.2.0) auf React-Native verwende. Ich kann das gelbe Feld auf dem Gerätebildschirm zum Schweigen bringen mit:

import { YellowBox } from 'react-native'

YellowBox.ignoreWarnings([
  'Unrecognized WebSocket connection option(s) `agent`, `perMessageDeflate`, `pfx`, `key`, `passphrase`, `cert`, `ca`, `ciphers`, `rejectUnauthorized`. Did you mean to put these under `headers`?'
])

aber ich bekomme immer noch diese nervige Warnung auf der Konsole ...

Downgrade auf "socket.io-client": "2.1.0" und alles in Ordnung

Bei mir hat es funktioniert, als ich auf 2.1.1 heruntergestuft habe:
yarn add [email protected]

Zuerst hat es nicht funktioniert, weil ich das Symbol ^ vor der Version socket.io-client@^2.1.1 hinzugefügt habe,

Immer noch ein Problem @ 2.2.0

Versuchen Sie, socket.io-client auf 1.7.2 herunterzustufen, es funktioniert für mich.

Immer noch ein Problem @ ^ 2.3.0

Immer noch ein Problem v2.3.0 mit reag-native

@ 2.1.1 ist OK. Aber 2.3.0 wirft die Warnmeldung auf RN 0.61.1

jede Lösung bis jetzt

Immer noch ein Problem v2.3.0 mit React-Native

Hallo Leute! Wir haben dieses Problem durch ein Downgrade auf Version 2.1.1 behoben

Stellen Sie sicher, dass Sie die ältere Version vollständig entfernen und den Cache leeren.

  1. Entfernen Sie socket.io-client aus package.json und löschen Sie besser Ihre package-lock / yarn.lock-Dateien.
  2. Löschen Sie Ihren gesamten Ordner node_modules (neu starten)
  3. npm Socket installieren [email protected] --save

Getan! Dies sollte mit React-Native & React-Native-Web funktionieren!

Ich habe das gleiche Problem mit react-native: 0.61.4 aber irgendwie stürzt die App ab. Ich weiß nicht, ob es aufgrund der Warnung passiert oder ob es sich um eine andere Sache handelt, die mit dem Socket zusammenhängt, aber als ich versuchte, eine Verbindung zum Socket herzustellen App wird geschlossen.

Das ist mein conf:
{ autoConnect: false, reconnectionDelay: 1000, reconnection: true, transports: ['websocket'], agent: false, // [2] Please don't set this to true upgrade: false, rejectUnauthorized: false }

Stürzt socket.open ab, wenn der Socket bereits verbunden ist?

Diese Warnung wird hier um ReactNative/WebSocket.js:117 ausgelöst, da EngineIO (von SocketIO unter der Haube verwendet) über EngineIO/websocket.js:121 die exponierte ReactNative WebSocket-Implementierung verweist, die opts und die Eigenschaften enthält, die In der Warnmeldung wird erwähnt. Seltsamerweise sind diese zusätzlichen Eigenschaften, die von den EngineIO-Betreuern per Kommentar beschrieben wurden, "SSL-Optionen für den Node.js-Client".

Indem Sie so etwas wie den folgenden Code bei EngineIO/websocket.js:114 einfügen, um die dem WebSocket-Konstruktor zugewiesenen opts EngineIO/websocket.js:114 zu manipulieren, entfernen wir alle überflüssigen Schlüssel in opts , um zu verhindern, dass die Warnung in der angezeigt wird erster Platz ( omit wird aus Lodash importiert, kann überarbeitet werden).

// lib/transports/websocket.js
...
if (this.isReactNative) {
  // prettier-ignore
  opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']);
}
...

Wenn Sie nach einer Lösung suchen, bei der die Warnung nicht einfach über YellowBox.ignoreWarnings stummgeschaltet wird, können Sie die doOpen wie in EngineIO/websocket.js:87 definiert überschreiben, indem Sie unten etwas Ähnliches hinzufügen , zum Einstiegspunkt Ihres ReactNative-Projekts, normalerweise index.js .

// index.js
...
+ import 'patches/EngineIOHeaderWarning';
...
// patches/EngineIOHeaderWarning.js
const WS = require('engine.io-client/lib/transports/websocket');

var WebSocketImpl = WebSocket; // eslint-disable-line no-undef

WS.prototype.doOpen = function() {
  if (!this.check()) {
    // let probe timeout
    return;
  }

  var uri = this.uri();
  var protocols = this.protocols;
  var opts = {};

  if (this.extraHeaders) {
    opts.headers = this.extraHeaders;
  }
  if (this.localAddress) {
    opts.localAddress = this.localAddress;
  }

  try {
    this.ws = new WebSocketImpl(uri, protocols, opts);
  } catch (err) {
    return this.emit('error', err);
  }
};

Wenn wir eine Pull-Anforderung für EngineIO erstellen, um diese zusätzlichen opts auszuschließen, die bei Verwendung in ReactNative über this.isReactNative nicht benötigt werden, können wir diese Warnung für alle unterdrücken, die den SocketIO-Client in ihrem verwenden ReactNative Projekte.

Du möchtest:

  • [x] einen _bug_ melden
  • [] fordere ein _feature_ an

Aktuelles Verhalten

Wenn ich socket.io-client in einem leeren React Native Expo-Projekt installiere, wird eine gelbe Meldung angezeigt mit:

Unrecognized WebSocket connection option(s) `agent`, `perMessageDeflate`, `pfx`, `key`, `passphrase`, `cert`, `ca`, `ciphers`, `rejectUnauthorized`. Did you mean to put these under `headers`?

Schritte zum Reproduzieren (wenn das aktuelle Verhalten ein Fehler ist)

yarn add socket.io-client

In App.js im React Native-Projekt:

import React from 'react';
import { YellowBox } from 'react-native';
import io from 'socket.io-client';

YellowBox.ignoreWarnings(['Remote debugger']);

import AppContainer from './config/routing';

export default class App extends React.Component {
    constructor(props) {
        super(props);
    }

    componentWillMount() {
        const socket = io('http://10.0.60.26:3000', {
            forceNew: true
        });
        socket.on('connect', () => console.log('Connection'));
    }

    render() {
        return <AppContainer />;
    }
}

Meine Lösung:

Speichern Sie den Socket einfach in einem useState wie folgt:

io von 'socket.io-client' importieren;
// ...

const [socket] = useState(() => io('SERVER_URL'));

Problem gelöst.

In meinem Fall ist v2.3 in Ordnung, wenn ich eine Verbindung zum lokalen socket.io-Server herstelle.
Es treten jedoch Fehler auf, wenn ich eine Verbindung zum Remote-Server socket.io herstelle.
Die Serverquelle ist dieselbe.
Also habe ich die socket.io-Client-Version auf 2.1.1 heruntergestuft und es funktioniert einwandfrei.

Diese Warnung wird hier um ReactNative/WebSocket.js:117 ausgelöst, da EngineIO (von SocketIO unter der Haube verwendet) über EngineIO/websocket.js:121 die exponierte ReactNative WebSocket-Implementierung verweist, die opts und die Eigenschaften enthält, die In der Warnmeldung wird erwähnt. Seltsamerweise sind diese zusätzlichen Eigenschaften, die von den EngineIO-Betreuern per Kommentar beschrieben wurden, "SSL-Optionen für den Node.js-Client".

Indem Sie so etwas wie den folgenden Code bei EngineIO/websocket.js:114 einfügen, um die dem WebSocket-Konstruktor zugewiesenen opts EngineIO/websocket.js:114 zu manipulieren, entfernen wir alle überflüssigen Schlüssel in opts , um zu verhindern, dass die Warnung in der angezeigt wird erster Platz ( omit wird aus Lodash importiert, kann überarbeitet werden).

// lib/transports/websocket.js
...
if (this.isReactNative) {
  // prettier-ignore
  opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']);
}
...

Wenn Sie nach einer Lösung suchen, bei der die Warnung nicht einfach über YellowBox.ignoreWarnings stummgeschaltet wird, können Sie die doOpen wie in EngineIO/websocket.js:87 definiert überschreiben, indem Sie unten etwas Ähnliches hinzufügen , zum Einstiegspunkt Ihres ReactNative-Projekts, normalerweise index.js .

// index.js
...
+ import 'patches/EngineIOHeaderWarning';
...
// patches/EngineIOHeaderWarning.js
const WS = require('engine.io-client/lib/transports/websocket');

var WebSocketImpl = WebSocket; // eslint-disable-line no-undef

WS.prototype.doOpen = function() {
  if (!this.check()) {
    // let probe timeout
    return;
  }

  var uri = this.uri();
  var protocols = this.protocols;
  var opts = {};

  if (this.extraHeaders) {
    opts.headers = this.extraHeaders;
  }
  if (this.localAddress) {
    opts.localAddress = this.localAddress;
  }

  try {
    this.ws = new WebSocketImpl(uri, protocols, opts);
  } catch (err) {
    return this.emit('error', err);
  }
};

Wenn wir eine Pull-Anforderung für EngineIO erstellen, um diese zusätzlichen opts auszuschließen, die bei Verwendung in ReactNative über this.isReactNative nicht benötigt werden, können wir diese Warnung für alle unterdrücken, die den SocketIO-Client in ihrem verwenden ReactNative Projekte.

Ihr Code erlaubte mir nicht, eine Verbindung zum Server herzustellen, und änderte das beabsichtigte Verhalten von EngineIO. Daher habe ich diese Optionen nur in eine if-Anweisung eingeschlossen, aber denselben Patch-Mechanismus verwendet, den Sie vorgeschlagen haben

// patches/EngineIOHeaderWarning.js
const WS = require('engine.io-client/lib/transports/websocket');

var WebSocketImpl = WebSocket; // eslint-disable-line no-undef

WS.prototype.doOpen = function() {
    if (!this.check()) {
        // let probe timeout
        return;
    }

    var uri = this.uri();
    var protocols = this.protocols;
    var opts = {};

    if(!this.isReactNative){
        opts.agent = this.agent;
        opts.perMessageDeflate = this.perMessageDeflate;

        // SSL options for Node.js client
        opts.pfx = this.pfx;
        opts.key = this.key;
        opts.passphrase = this.passphrase;
        opts.cert = this.cert;
        opts.ca = this.ca;
        opts.ciphers = this.ciphers;
        opts.rejectUnauthorized = this.rejectUnauthorized;
    }


    if (this.extraHeaders) {
        opts.headers = this.extraHeaders;
    }
    if (this.localAddress) {
        opts.localAddress = this.localAddress;
    }

    try {
        this.ws =
            this.usingBrowserWebSocket && !this.isReactNative
                ? protocols
                ? new WebSocketImpl(uri, protocols)
                : new WebSocketImpl(uri)
                : new WebSocketImpl(uri, protocols, opts);
    } catch (err) {
        return this.emit('error', err);
    }

    if (this.ws.binaryType === undefined) {
        this.supportsBinary = false;
    }

    if (this.ws.supports && this.ws.supports.binary) {
        this.supportsBinary = true;
        this.ws.binaryType = 'nodebuffer';
    } else {
        this.ws.binaryType = 'arraybuffer';
    }

    this.addEventListeners();
};

Downgrade auf "socket.io-client": "2.1.0" und alles in Ordnung

Das hat bei mir funktioniert.

Wenn ich das Problem gut verstehe, ist dies ein verwandtes Abhängigkeitsproblem, das in https://github.com/socketio/socket.io-client/commit/06e9a4ca2621176c30c352b2ba8b34fa42b8d0ba eingeführt wird?

Das Downgrade auf 2.1.1 funktioniert zwar, aber wir bleiben bei zwei Jahre alten Releases.

Kann @ptboyer angewendet und auf das Projekt

Beeinträchtigt diese Warnung die Funktionalität des Pakets? Einfach einrichten und nicht davon zurückgehalten werden wollen. Gerne ignorieren, wenn es keine anderen Konsequenzen hat

Edit: Für alle, die sich das Gleiche fragen. Soweit ich das beurteilen kann, spielt diese Warnung keine Rolle.

@schumannd In diesem Problem geht es lediglich darum, die Fehler- / Warnmeldung

+1

Ich bin sehr besorgt darüber, ob die socket.io-Bibliothek noch gepflegt ist oder nicht, da keine offizielle Antwort auf ein Update oder ein bevorstehendes Update vorliegt.

+1

+1

const _io = ioClient.connect(socketurl, { forceNode: true });
Es ist Arbeit

@isthaison Es funktioniert nicht bei mir

@isthaison für mich funktioniert es ... aber jede andere http-Anfrage wird sehr langsam ... Ich weiß nicht, wie es mit der Problemumgehung zusammenhängt ... aber es ist ...

{forceNode: true}

Vielen Dank. diese Arbeit für mich.

Dies ist die einzige Lösung, die für mich funktioniert hat.

Diese Warnung wird hier um ReactNative/WebSocket.js:117 ausgelöst, da EngineIO (von SocketIO unter der Haube verwendet) über EngineIO/websocket.js:121 die exponierte ReactNative WebSocket-Implementierung verweist, die opts und die Eigenschaften enthält, die In der Warnmeldung wird erwähnt. Seltsamerweise sind diese zusätzlichen Eigenschaften, die von den EngineIO-Betreuern per Kommentar beschrieben wurden, "SSL-Optionen für den Node.js-Client".
Indem Sie so etwas wie den folgenden Code bei EngineIO/websocket.js:114 einfügen, um die dem WebSocket-Konstruktor zugewiesenen opts EngineIO/websocket.js:114 zu manipulieren, entfernen wir alle überflüssigen Schlüssel in opts , um zu verhindern, dass die Warnung in der angezeigt wird erster Platz ( omit wird aus Lodash importiert, kann überarbeitet werden).

// lib/transports/websocket.js
...
if (this.isReactNative) {
  // prettier-ignore
  opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']);
}
...

Wenn Sie nach einer Lösung suchen, bei der die Warnung nicht einfach über YellowBox.ignoreWarnings stummgeschaltet wird, können Sie die doOpen wie in EngineIO/websocket.js:87 definiert überschreiben, indem Sie unten etwas Ähnliches hinzufügen , zum Einstiegspunkt Ihres ReactNative-Projekts, normalerweise index.js .

// index.js
...
+ import 'patches/EngineIOHeaderWarning';
...
// patches/EngineIOHeaderWarning.js
const WS = require('engine.io-client/lib/transports/websocket');

var WebSocketImpl = WebSocket; // eslint-disable-line no-undef

WS.prototype.doOpen = function() {
  if (!this.check()) {
    // let probe timeout
    return;
  }

  var uri = this.uri();
  var protocols = this.protocols;
  var opts = {};

  if (this.extraHeaders) {
    opts.headers = this.extraHeaders;
  }
  if (this.localAddress) {
    opts.localAddress = this.localAddress;
  }

  try {
    this.ws = new WebSocketImpl(uri, protocols, opts);
  } catch (err) {
    return this.emit('error', err);
  }
};

Wenn wir eine Pull-Anforderung für EngineIO erstellen, um diese zusätzlichen opts auszuschließen, die bei Verwendung in ReactNative über this.isReactNative nicht benötigt werden, können wir diese Warnung für alle unterdrücken, die den SocketIO-Client in ihrem verwenden ReactNative Projekte.

Ihr Code erlaubte mir nicht, eine Verbindung zum Server herzustellen, und änderte das beabsichtigte Verhalten von EngineIO. Daher habe ich diese Optionen nur in eine if-Anweisung eingeschlossen, aber denselben Patch-Mechanismus verwendet, den Sie vorgeschlagen haben

// patches/EngineIOHeaderWarning.js
const WS = require('engine.io-client/lib/transports/websocket');

var WebSocketImpl = WebSocket; // eslint-disable-line no-undef

WS.prototype.doOpen = function() {
    if (!this.check()) {
        // let probe timeout
        return;
    }

    var uri = this.uri();
    var protocols = this.protocols;
    var opts = {};

    if(!this.isReactNative){
        opts.agent = this.agent;
        opts.perMessageDeflate = this.perMessageDeflate;

        // SSL options for Node.js client
        opts.pfx = this.pfx;
        opts.key = this.key;
        opts.passphrase = this.passphrase;
        opts.cert = this.cert;
        opts.ca = this.ca;
        opts.ciphers = this.ciphers;
        opts.rejectUnauthorized = this.rejectUnauthorized;
    }


    if (this.extraHeaders) {
        opts.headers = this.extraHeaders;
    }
    if (this.localAddress) {
        opts.localAddress = this.localAddress;
    }

    try {
        this.ws =
            this.usingBrowserWebSocket && !this.isReactNative
                ? protocols
                ? new WebSocketImpl(uri, protocols)
                : new WebSocketImpl(uri)
                : new WebSocketImpl(uri, protocols, opts);
    } catch (err) {
        return this.emit('error', err);
    }

    if (this.ws.binaryType === undefined) {
        this.supportsBinary = false;
    }

    if (this.ws.supports && this.ws.supports.binary) {
        this.supportsBinary = true;
        this.ws.binaryType = 'nodebuffer';
    } else {
        this.ws.binaryType = 'arraybuffer';
    }

    this.addEventListeners();
};

const _io = ioClient.connect(socketurl, { forceNode: true });
Es ist Arbeit

Es funktioniert bei mir, danke!

"socket.io-client": "^2.3.0"

const socket = io(host, { forceNode: true });

const _io = ioClient.connect(socketurl, { forceNode: true });
Es ist Arbeit

Es funktioniert bei mir, danke!

"socket.io-client": "^2.3.0"

const socket = io(host, { forceNode: true });

Es hat auch bei mir funktioniert! Vielen Dank

Sie können einfach einige Header hinzufügen und es funktioniert!
socket = io.connect('SOCKET_URL_HERE', { jsonp: false, agent: '-', pfx: '-', cert: '-', ca: '-', ciphers: '-', rejectUnauthorized: '-', perMessageDeflate: '-' });

const _io = ioClient.connect (socketurl, {forceNode: true});

Dadurch wird die Warnung behoben, aber meine Socket-Verbindung wird sehr langsam (Timeout tatsächlich), sodass sie für mich unbrauchbar ist.

const _io = ioClient.connect (socketurl, {forceNode: true});

Dadurch wird die Warnung behoben, aber meine Socket-Verbindung wird sehr langsam (Timeout tatsächlich), sodass sie für mich unbrauchbar ist.

Gleiches hier: Verbindungs-Timeout!

Ich habe froceNode losgeworden und auf 2.1.0 herabgestuft, und es hat gut funktioniert. Ich hatte auch das Problem, dass ich localhost und nicht die IP für mein Emulatorgerät verwendete.

Das gleiche @SaveYourTime , ich benutze "socket.io-client": "^2.3.0"
Siehe hier https://socket.io/docs/client-api/.
Ich warum forceNode Option hinzufügen

Dieses Problem sollte in engine.io-client v3.4.3 behoben sein. Sie müssen also nur die Datei yarn.lock und das Verzeichnis node_modules löschen und dann yarn install ausführen

ref https://github.com/socketio/engine.io-client/commit/2f5c948abe8fd1c0fdb010e88f96bd933a3792ea

@BassemN Vielleicht könnten Sie anstatt Ihre Datei yarn.lock zu löschen, yarn upgrade-interactive um die Version sicher zu stoßen?

Es scheint der Idee einer "Sperr" -Datei etwas zu widersprechen, wenn Sie sie jedes Mal, wenn Sie Ihre Pakete aktualisieren möchten, vollständig zerstören. 😅

Es sollte durch https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b behoben werden (enthalten in [email protected] und [email protected] ).

In Bezug auf die Option forceNode scheint React Native tatsächlich WebSocket ( ref ) zu unterstützen, sodass forceNode: true nicht benötigt werden sollte. Ist das nicht der Fall?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen