Socket.io-client: Option (s) de connexion WebSocket non reconnue (s) `agent`,` perMessageDeflate`, `pfx`,` key`, `passphrase`,` cert`, `ca`,` ciphers`, `replyUnauthorized`. Vouliez-vous les mettre sous «en-têtes»?

Créé le 15 avr. 2019  ·  49Commentaires  ·  Source: socketio/socket.io-client

Tu veux:

  • [x] signaler un bogue
  • [] demander une fonctionnalité

Comportement actuel

Lorsque j'installe socket.io-client sur un projet vierge React Native Expo, j'ai un message jaune avec:

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

Étapes à reproduire (si le comportement actuel est un bogue)

yarn add socket.io-client

Dans App.js dans le projet React Native:

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

Commentaire le plus utile

Pour moi, cela a fonctionné lorsque j'ai rétrogradé à 2.1.1 j'ai fait:
yarn add [email protected]

Au début, cela n'a pas fonctionné car j'ajoutais le symbole ^ avant la version socket.io-client@^2.1.1 qui, je crois, accepte d'autres versions mineures du package.

Tous les 49 commentaires

Même problème :(

+1

+1

+1

Semble avoir été un problème depuis au moins aussi loin que le 18 décembre

+1

+1

+1

+1

Je reçois toujours cet avertissement lors de l'utilisation de socket.io (2.2.0) sur React-Native. Je peux faire taire la case jaune sur l'écran de l'appareil avec:

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`?'
])

mais je reçois toujours cet avertissement ennuyeux sur la console ...

rétrograder vers "socket.io-client": "2.1.0" et tout est OK

Pour moi, cela a fonctionné lorsque j'ai rétrogradé à 2.1.1 j'ai fait:
yarn add [email protected]

Au début, cela n'a pas fonctionné car j'ajoutais le symbole ^ avant la version socket.io-client@^2.1.1 qui, je crois, accepte d'autres versions mineures du package.

Encore un problème @ 2.2.0

Essayez de rétrograder socket.io-client vers la version 1.7.2, cela fonctionne pour moi.

Encore un problème @ ^ 2.3.0

Encore un problème v2.3.0 avec react-native

@ 2.1.1 est OK. Mais 2.3.0 jette le message d'avertissement sur RN 0.61.1

toute solution jusqu'à présent

Encore un problème v2.3.0 avec react-native

Salut les gars! Nous avons résolu ce problème en passant à la version

Assurez-vous de supprimer complètement l'ancienne version et de vider le cache.

  1. supprimez socket.io-client de package.json et supprimez mieux vos fichiers package-lock / yarn.lock.
  2. supprimer tout votre dossier node_modules (recommencer)
  3. npm install socket.

Terminé! Cela devrait fonctionner avec react-native et react-native-web!

J'ai le même problème avec react-native: 0.61.4 mais d'une manière ou d'une autre l'application plante, je ne sais pas si cela se produit à cause de l'avertissement ou s'il s'agit d'une autre chose liée à la socket, mais quand j'ai essayé de me connecter au socket, le l'application se ferme.

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

Est-ce que socket.open plante si le socket est déjà connecté?

Cet avertissement est déclenché ici par ReactNative/WebSocket.js:117 car EngineIO (utilisé par SocketIO sous le capot) fera référence à l'implémentation ReactNative WebSocket exposée via EngineIO/websocket.js:121 qui est passé opts qui contient les propriétés qui le message d'avertissement mentionne. Curieusement, ces propriétés ajoutées décrites par les responsables d'EngineIO via un commentaire sont des "options SSL pour le client Node.js".

En insérant quelque chose comme le code ci-dessous à EngineIO/websocket.js:114 pour manipuler le opts donné au constructeur WebSocket, nous supprimons toutes les clés superflues dans opts pour empêcher l'avertissement d'apparaître dans le première place ( omit est importé de Lodash, peut être retravaillé).

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

Si vous recherchez une solution qui n'implique pas simplement de désactiver l'avertissement via YellowBox.ignoreWarnings vous pouvez remplacer complètement le doOpen tel que défini EngineIO/websocket.js:87 en ajoutant quelque chose comme ceci ci-dessous , au point d'entrée de votre projet ReactNative, généralement 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);
  }
};

Dans l'ensemble, si nous créons une pull request pour EngineIO pour exclure ces opts supplémentaires qui ne sont pas nécessaires lorsqu'ils sont utilisés dans ReactNative via this.isReactNative nous pourrions supprimer cet avertissement pour tous ceux qui utilisent le client SocketIO dans leur Projets ReactNative.

Tu veux:

  • [x] signaler un _bug_
  • [] demander une _fonctionnalité_

Comportement actuel

Lorsque j'installe socket.io-client sur un projet vierge React Native Expo, j'ai un message jaune avec:

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

Étapes à reproduire (si le comportement actuel est un bogue)

yarn add socket.io-client

Dans App.js dans le projet React Native:

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 />;
    }
}

Ma solution:

Enregistrez simplement le socket dans un useState comme ceci:

importer io depuis 'socket.io-client';
// ...

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

Problème résolu.

Dans mon cas, la v2.3 est correcte lorsque je me connecte au serveur socket.io local.
Mais il se produit des erreurs lorsque je me connecte au serveur socket.io distant.
La source du serveur est la même.
Je rétrograde donc la version client socket.io vers 2.1.1, et cela fonctionne très bien.

Cet avertissement est déclenché ici par ReactNative/WebSocket.js:117 car EngineIO (utilisé par SocketIO sous le capot) fera référence à l'implémentation ReactNative WebSocket exposée via EngineIO/websocket.js:121 qui est passé opts qui contient les propriétés qui le message d'avertissement mentionne. Curieusement, ces propriétés ajoutées décrites par les responsables d'EngineIO via un commentaire sont des "options SSL pour le client Node.js".

En insérant quelque chose comme le code ci-dessous à EngineIO/websocket.js:114 pour manipuler le opts donné au constructeur WebSocket, nous supprimons toutes les clés superflues dans opts pour empêcher l'avertissement d'apparaître dans le première place ( omit est importé de Lodash, peut être retravaillé).

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

Si vous recherchez une solution qui n'implique pas simplement de désactiver l'avertissement via YellowBox.ignoreWarnings vous pouvez remplacer complètement le doOpen tel que défini EngineIO/websocket.js:87 en ajoutant quelque chose comme ceci ci-dessous , au point d'entrée de votre projet ReactNative, généralement 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);
  }
};

Dans l'ensemble, si nous créons une pull request pour EngineIO pour exclure ces opts supplémentaires qui ne sont pas nécessaires lorsqu'ils sont utilisés dans ReactNative via this.isReactNative nous pourrions supprimer cet avertissement pour tous ceux qui utilisent le client SocketIO dans leur Projets ReactNative.

Votre code ne me permettait pas de me connecter au serveur et a changé le comportement prévu d'EngineIO, donc je viens d'encapsuler ces options dans une instruction if mais j'ai utilisé le même mécanisme de patch que vous avez suggéré

// 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();
};

rétrograder vers "socket.io-client": "2.1.0" et tout est OK

Cela a fonctionné pour moi.

Si je comprends bien le problème, s'agit-il d'un problème de dépendances lié introduit dans https://github.com/socketio/socket.io-client/commit/06e9a4ca2621176c30c352b2ba8b34fa42b8d0ba?

Le passage à la version 2.1.1 fonctionne en effet, mais nous sommes bloqués sur une version vieille de deux ans.

@Ptboyer peut-

Cet avertissement affecte-t-il la fonctionnalité du package? Il suffit de le configurer et de ne pas être retenu par cela. Heureux d'ignorer si cela n'a pas d'autres conséquences

Edit: Pour tous ceux qui se demandent la même chose. Pour autant que je sache, cet avertissement est sans conséquence.

@schumannd Ce problème concerne uniquement la désactivation du message d'erreur / d'avertissement. Sur le plan fonctionnel, cet avertissement est sans conséquence. :)

+1

Je suis très inquiet de savoir si la bibliothèque socket.io est toujours maintenue ou non en raison de l'absence de réponse officielle sur un correctif ou une mise à jour à venir.

+1

+1

const _io = ioClient.connect(socketurl, { forceNode: true });
C'est du travail

@isthaison ça ne marche pas pour moi

@isthaison pour moi cela fonctionne ... mais chaque autre requête http devient très lente ... je ne sais pas comment cela est lié à la solution de contournement ... mais c'est ...

{forceNode: true}

Je vous remercie. ce travail pour moi.

C'est la seule solution qui a fonctionné pour moi.

Cet avertissement est déclenché ici par ReactNative/WebSocket.js:117 car EngineIO (utilisé par SocketIO sous le capot) fera référence à l'implémentation ReactNative WebSocket exposée via EngineIO/websocket.js:121 qui est passé opts qui contient les propriétés qui le message d'avertissement mentionne. Curieusement, ces propriétés ajoutées décrites par les responsables d'EngineIO via un commentaire sont des "options SSL pour le client Node.js".
En insérant quelque chose comme le code ci-dessous à EngineIO/websocket.js:114 pour manipuler le opts donné au constructeur WebSocket, nous supprimons toutes les clés superflues dans opts pour empêcher l'avertissement d'apparaître dans le première place ( omit est importé de Lodash, peut être retravaillé).

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

Si vous recherchez une solution qui n'implique pas simplement de désactiver l'avertissement via YellowBox.ignoreWarnings vous pouvez remplacer complètement le doOpen tel que défini EngineIO/websocket.js:87 en ajoutant quelque chose comme ceci ci-dessous , au point d'entrée de votre projet ReactNative, généralement 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);
  }
};

Dans l'ensemble, si nous créons une pull request pour EngineIO pour exclure ces opts supplémentaires qui ne sont pas nécessaires lorsqu'ils sont utilisés dans ReactNative via this.isReactNative nous pourrions supprimer cet avertissement pour tous ceux qui utilisent le client SocketIO dans leur Projets ReactNative.

Votre code ne me permettait pas de me connecter au serveur et a changé le comportement prévu d'EngineIO, donc je viens d'encapsuler ces options dans une instruction if mais j'ai utilisé le même mécanisme de patch que vous avez suggéré

// 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 });
C'est du travail

Cela fonctionne avec moi, merci!

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

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

const _io = ioClient.connect(socketurl, { forceNode: true });
C'est du travail

Cela fonctionne avec moi, merci!

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

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

Il a travaillé pour moi aussi! Grand merci

Vous pouvez simplement ajouter des en-têtes et cela fonctionne!
socket = io.connect('SOCKET_URL_HERE', { jsonp: false, agent: '-', pfx: '-', cert: '-', ca: '-', ciphers: '-', rejectUnauthorized: '-', perMessageDeflate: '-' });

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

Cela résout l'avertissement mais rend ma connexion socket vraiment très lente (timeout en fait), donc c'est inutilisable pour moi.

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

Cela résout l'avertissement mais rend ma connexion socket vraiment très lente (timeout en fait), donc c'est inutilisable pour moi.

idem ici: délai de connexion!

Je me suis débarrassé de froceNode et je suis passé à 2.1.0 et cela a bien fonctionné. J'ai également eu le problème d'utiliser localhost et non l'adresse IP de mon émulateur.

Le même @SaveYourTime , j'utilise "socket.io-client": "^2.3.0"
référez-vous ici https://socket.io/docs/client-api/.
Je pourquoi ajouter l'option forceNode

Ce problème devrait être résolu sur engine.io-client v3.4.3 donc tout ce que vous avez à faire est de supprimer le fichier yarn.lock et le répertoire node_modules puis exécutez yarn install

réf https://github.com/socketio/engine.io-client/commit/2f5c948abe8fd1c0fdb010e88f96bd933a3792ea

@BassemN Peut-être qu'au lieu de supprimer votre fichier yarn.lock, vous pourriez utiliser yarn upgrade-interactive pour modifier la version en toute sécurité?

Cela semble un peu contre-intuitif à l'idée d'un fichier "verrouillé" si vous le détruisez complètement à chaque fois que vous souhaitez mettre à jour vos paquets. 😅

Il devrait être corrigé par https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b (inclus dans [email protected] et [email protected] ).

En ce qui concerne l'option forceNode , il semble que React Native supporte réellement WebSocket ( ref ), donc forceNode: true ne devrait pas être nécessaire. N'est-ce pas le cas?

Cette page vous a été utile?
0 / 5 - 0 notes