Socket.io-client: Opción (es) de conexión WebSocket no reconocida `agent`,` perMessageDeflate`, `pfx`,` key`, `passphrase`,` cert`, `ca`,` ciphers`, `verifyUnauthorized`. ¿Querías poner estos bajo "encabezados"?

Creado en 15 abr. 2019  ·  49Comentarios  ·  Fuente: socketio/socket.io-client

Tú quieres:

  • [x] informar un error
  • [] solicitar una función

Comportamiento actual

Cuando instalo socket.io-client en un proyecto de React Native Expo en blanco, tengo un mensaje amarillo con:

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

Pasos para reproducir (si el comportamiento actual es un error)

yarn add socket.io-client

En App.js en el proyecto 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

Comentario más útil

Para mí funcionó cuando bajé a 2.1.1 lo hice:
yarn add [email protected]

Al principio no funcionó porque estaba agregando el símbolo ^ antes de la versión socket.io-client@^2.1.1 que creo que acepta otras versiones menores del paquete.

Todos 49 comentarios

El mismo problema :(

+1

+1

+1

Parece haber sido un problema desde al menos el 18 de diciembre.

+1

+1

+1

+1

Sigo recibiendo esta advertencia cuando uso socket.io (2.2.0) en React-Native. Puedo silenciar el cuadro amarillo en la pantalla del dispositivo con:

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

pero sigo recibiendo esta molesta advertencia en la consola ...

cambiar a "socket.io-client": "2.1.0" y todo bien

Para mí funcionó cuando bajé a 2.1.1 lo hice:
yarn add [email protected]

Al principio no funcionó porque estaba agregando el símbolo ^ antes de la versión socket.io-client@^2.1.1 que creo que acepta otras versiones menores del paquete.

Sigue siendo un problema @ 2.2.0

Intente degradar socket.io-client a 1.7.2, me funciona.

Sigue siendo un problema @ ^ 2.3.0

Sigue siendo un problema v2.3.0 con react-native

@ 2.1.1 está bien. Pero 2.3.0 lanza el mensaje de advertencia en RN 0.61.1

cualquier solución hasta ahora

Sigue siendo un problema v2.3.0 con react-native

¡Hola chicos! Hemos solucionado este problema degradándose a

Asegúrese de eliminar por completo la versión anterior y borrar el caché.

  1. elimine socket.io-client de package.json y mejor elimine sus archivos package-lock / yarn.lock.
  2. elimine toda su carpeta node_modules (comience de nuevo)
  3. npm install socket.

¡Hecho! ¡Esto debería funcionar con react-native y react-native-web!

Tengo este mismo problema con react-native: 0.61.4 pero de alguna manera la aplicación se bloquea, no sé si está sucediendo debido a la advertencia o si es otra cosa relacionada con el socket, pero cuando intenté conectarme al socket, el la aplicación se cierra.

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

¿ socket.open bloquea si el conector ya está conectado?

Esta advertencia se genera aquí por ReactNative/WebSocket.js:117 porque EngineIO (utilizado por SocketIO bajo el capó) hará referencia a la implementación de ReactNative WebSocket expuesta a través de EngineIO/websocket.js:121 que se pasa opts que contiene las propiedades que el mensaje de advertencia menciona. Curiosamente, estas propiedades agregadas descritas por los mantenedores de EngineIO a través de un comentario son "Opciones de SSL para el cliente Node.js".

Al insertar algo como el código siguiente en EngineIO/websocket.js:114 para manipular el opts dado al constructor de WebSocket, eliminamos todas las claves extrañas en opts para evitar que la advertencia aparezca en el primer lugar ( omit se importa de Lodash, se puede reelaborar).

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

Si está buscando una solución que no implique simplemente silenciar la advertencia a través de YellowBox.ignoreWarnings entonces podría anular completamente doOpen como se define EngineIO/websocket.js:87 agregando algo como esto a continuación , al punto de entrada de su proyecto ReactNative, normalmente 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);
  }
};

En general, si creamos una solicitud de extracción para EngineIO para excluir estos opts adicionales que no son necesarios cuando se usan en ReactNative a través de this.isReactNative entonces podríamos suprimir esta advertencia para todos los que usan el cliente SocketIO en su Proyectos ReactNative.

Tú quieres:

  • [x] informar un _bug_
  • [] solicita una _feature_

Comportamiento actual

Cuando instalo socket.io-client en un proyecto de React Native Expo en blanco, tengo un mensaje amarillo con:

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

Pasos para reproducir (si el comportamiento actual es un error)

yarn add socket.io-client

En App.js en el proyecto 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 />;
    }
}

Mi solución:

Simplemente guarde el socket en un useState como este:

importar io desde 'socket.io-client';
// ...

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

Problema resuelto.

En mi caso, la versión 2.3 está bien cuando me conecto al servidor local socket.io.
Pero ocurren errores cuando me conecto al servidor remoto socket.io.
La fuente del servidor es la misma.
Así que bajé la versión del cliente socket.io a 2.1.1, y funciona bien.

Esta advertencia se genera aquí por ReactNative/WebSocket.js:117 porque EngineIO (utilizado por SocketIO bajo el capó) hará referencia a la implementación de ReactNative WebSocket expuesta a través de EngineIO/websocket.js:121 que se pasa opts que contiene las propiedades que el mensaje de advertencia menciona. Curiosamente, estas propiedades agregadas descritas por los mantenedores de EngineIO a través de un comentario son "Opciones de SSL para el cliente Node.js".

Al insertar algo como el código siguiente en EngineIO/websocket.js:114 para manipular el opts dado al constructor de WebSocket, eliminamos todas las claves extrañas en opts para evitar que la advertencia aparezca en el primer lugar ( omit se importa de Lodash, se puede reelaborar).

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

Si está buscando una solución que no implique simplemente silenciar la advertencia a través de YellowBox.ignoreWarnings entonces podría anular completamente doOpen como se define EngineIO/websocket.js:87 agregando algo como esto a continuación , al punto de entrada de su proyecto ReactNative, normalmente 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);
  }
};

En general, si creamos una solicitud de extracción para EngineIO para excluir estos opts adicionales que no son necesarios cuando se usan en ReactNative a través de this.isReactNative entonces podríamos suprimir esta advertencia para todos los que usan el cliente SocketIO en su Proyectos ReactNative.

Su código no me permitió conectarme al servidor y cambió el comportamiento previsto de EngineIO, así que acabo de envolver esas opciones en una declaración if pero usé el mismo mecanismo de parche que sugirió

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

cambiar a "socket.io-client": "2.1.0" y todo bien

Esto funcionó para mí.

Si entiendo bien el problema, ¿se trata de un problema de dependencias relacionado introducido en https://github.com/socketio/socket.io-client/commit/06e9a4ca2621176c30c352b2ba8b34fa42b8d0ba?

La degradación a 2.1.1 funciona de hecho, pero estamos atascados en versiones de hace dos años.

¿ Se puede aplicar y publicar

¿Esta advertencia afecta la funcionalidad del paquete? Simplemente configurándolo y no quiero ser retenido por esto. Feliz de ignorar si no tiene otras consecuencias

Editar: Para cualquiera que se pregunte lo mismo. Por lo que puedo decir, esta advertencia es intrascendente.

@schumannd Este problema se trata únicamente de silenciar el mensaje de error / advertencia. Funcionalmente, esta advertencia es intrascendente. :)

+1

Estoy muy preocupado por si la biblioteca socket.io aún se mantiene o no debido a que no hay una respuesta oficial sobre una solución o una próxima actualización.

+1

+1

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

@isthaison No me funciona

@isthaison para mí funciona ... pero todas las demás solicitudes http se vuelven muy lentas ... No sé cómo se relaciona con la solución ... pero es ...

{forceNode: true}

Gracias. este trabajo para mi.

Esta es la única solución que funcionó para mí.

Esta advertencia se genera aquí por ReactNative/WebSocket.js:117 porque EngineIO (utilizado por SocketIO bajo el capó) hará referencia a la implementación de ReactNative WebSocket expuesta a través de EngineIO/websocket.js:121 que se pasa opts que contiene las propiedades que el mensaje de advertencia menciona. Curiosamente, estas propiedades agregadas descritas por los mantenedores de EngineIO a través de un comentario son "Opciones de SSL para el cliente Node.js".
Al insertar algo como el código siguiente en EngineIO/websocket.js:114 para manipular el opts dado al constructor de WebSocket, eliminamos todas las claves extrañas en opts para evitar que la advertencia aparezca en el primer lugar ( omit se importa de Lodash, se puede reelaborar).

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

Si está buscando una solución que no implique simplemente silenciar la advertencia a través de YellowBox.ignoreWarnings entonces podría anular completamente doOpen como se define EngineIO/websocket.js:87 agregando algo como esto a continuación , al punto de entrada de su proyecto ReactNative, normalmente 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);
  }
};

En general, si creamos una solicitud de extracción para EngineIO para excluir estos opts adicionales que no son necesarios cuando se usan en ReactNative a través de this.isReactNative entonces podríamos suprimir esta advertencia para todos los que usan el cliente SocketIO en su Proyectos ReactNative.

Su código no me permitió conectarme al servidor y cambió el comportamiento previsto de EngineIO, así que acabo de envolver esas opciones en una declaración if pero usé el mismo mecanismo de parche que sugirió

// 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 trabajo

Funciona conmigo, ¡Gracias!

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

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

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

Funciona conmigo, ¡Gracias!

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

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

¡También funcionó para mí! Muchas gracias

Simplemente puede agregar algunos encabezados y ¡funciona!
socket = io.connect('SOCKET_URL_HERE', { jsonp: false, agent: '-', pfx: '-', cert: '-', ca: '-', ciphers: '-', rejectUnauthorized: '-', perMessageDeflate: '-' });

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

Esto resuelve la advertencia, pero hace que mi conexión de socket sea realmente muy lenta (tiempo de espera en realidad), por lo que es inutilizable para mí.

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

Esto resuelve la advertencia, pero hace que mi conexión de socket sea realmente muy lenta (tiempo de espera en realidad), por lo que es inutilizable para mí.

lo mismo aquí: tiempo de espera de conexión!

Me deshice de froceNode y lo bajé a 2.1.0 y funcionó bien. También tuve el problema de que estaba usando localhost y no la IP de mi dispositivo emulador.

Lo mismo @SaveYourTime , estoy usando "socket.io-client": "^2.3.0"
consulte aquí https://socket.io/docs/client-api/.
¿Por qué agregar la opción forceNode

Este problema debe solucionarse en engine.io-client v3.4.3 por lo que todo lo que necesita hacer es eliminar el archivo yarn.lock y el directorio node_modules luego ejecutar yarn install

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

@BassemN ¿ Quizás en lugar de eliminar su archivo yarn.lock, podría usar yarn upgrade-interactive para mejorar la versión de forma segura?

Parece un poco contrario a la intuición de la idea de un archivo "bloqueado" si lo destruye por completo cada vez que desea actualizar sus paquetes. 😅

Debe solucionarlo https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b (incluido en [email protected] y [email protected] ).

Con respecto a la opción forceNode , parece que React Native es compatible con WebSocket ( ref ), por lo que forceNode: true no debería ser necesario. ¿No es ese el caso?

¿Fue útil esta página
0 / 5 - 0 calificaciones