Socket.io-client: Opção (ões) de conexão WebSocket não reconhecida (s) `agent`,` perMessageDeflate`, `pfx`,` key`, `passphrase`,` cert`, `ca`,` ciphers`, `rejeitarUnauthorized`. Você quis dizer colocá-los em `cabeçalhos`?

Criado em 15 abr. 2019  ·  49Comentários  ·  Fonte: socketio/socket.io-client

Você quer:

  • [x] relatar um bug
  • [] solicitar um recurso

Comportamento atual

Quando eu instalo socket.io-client em um projeto React Native Expo em branco, recebo uma mensagem amarela com:

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

Etapas para reproduzir (se o comportamento atual for um bug)

yarn add socket.io-client

No App.js no projeto 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

Comentários muito úteis

Para mim, funcionou quando fiz o downgrade para 2.1.1:
yarn add [email protected]

No início não funcionou porque eu estava adicionando o símbolo ^ antes da versão socket.io-client@^2.1.1 que acredito aceitar outras versões secundárias do pacote.

Todos 49 comentários

Mesmo problema :(

+1

+1

+1

Parece ter sido um problema pelo menos desde 18 de dezembro

+1

+1

+1

+1

Ainda estou recebendo este aviso ao usar socket.io (2.2.0) no React-Native. Posso silenciar a caixa amarela na tela do dispositivo com:

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

mas ainda recebo este aviso irritante no console ...

downgrade para "socket.io-client": "2.1.0" e tudo OK

Para mim, funcionou quando fiz o downgrade para 2.1.1:
yarn add [email protected]

No início não funcionou porque eu estava adicionando o símbolo ^ antes da versão socket.io-client@^2.1.1 que acredito aceitar outras versões secundárias do pacote.

Ainda um problema @ 2.2.0

Tente fazer o downgrade do socket.io-client para 1.7.2, funciona para mim.

Ainda um problema @ ^ 2.3.0

Ainda um problema v2.3.0 com react-native

@ 2.1.1 está OK. Mas 2.3.0 lança a mensagem de aviso no RN 0.61.1

qualquer solução até agora

Ainda é um problema v2.3.0 com react-native

Ei pessoal! Corrigimos esse problema fazendo o downgrade para v2.1.1

Certifique-se de remover completamente a versão anterior e limpar o cache.

  1. remova o socket.io-client do package.json e exclua melhor seus arquivos package-lock / yarn.lock.
  2. exclua toda a sua pasta node_modules (comece do zero)
  3. npm instalar soquete.

Feito! Isso deve funcionar com react-native & react-native-web!

Eu tenho o mesmo problema com react-native: 0.61.4 mas de alguma forma o aplicativo está travando, não sei se isso está acontecendo por causa do aviso ou se é outra coisa relacionada ao soquete, mas quando tentei conectar ao soquete, o aplicativo fecha.

Esta é a minha 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 trava se o soquete já estiver conectado?

Este aviso é gerado aqui por ReactNative/WebSocket.js:117 porque EngineIO (usado por SocketIO sob o capô) fará referência à implementação ReactNative WebSocket exposta via EngineIO/websocket.js:121 que é passado opts que contém as propriedades que a mensagem de aviso menciona. Curiosamente, essas propriedades adicionadas descritas pelos mantenedores do EngineIO por meio de comentário são "opções de SSL para o cliente Node.js".

Ao inserir algo como o código abaixo em EngineIO/websocket.js:114 para manipular o opts dado ao construtor WebSocket, removemos todas as chaves estranhas em opts para impedir com sucesso que o aviso apareça no primeiro lugar ( omit é importado de Lodash, pode ser retrabalhado).

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

Se você está procurando uma solução que não envolve simplesmente silenciar o aviso via YellowBox.ignoreWarnings então você pode substituir completamente o doOpen conforme definido EngineIO/websocket.js:87 adicionando algo assim abaixo , ao ponto de entrada do seu projeto 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);
  }
};

No geral, se criarmos uma solicitação pull para EngineIO para excluir esses opts extras que não são necessários quando usados ​​no ReactNative por meio de this.isReactNative , poderíamos suprimir este aviso para todos os que usam o cliente SocketIO em seus Projetos ReactNative.

Você quer:

  • [x] relatar um _bug_
  • [] solicitar um _feature_

Comportamento atual

Quando eu instalo socket.io-client em um projeto React Native Expo em branco, recebo uma mensagem amarela com:

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

Etapas para reproduzir (se o comportamento atual for um bug)

yarn add socket.io-client

No App.js no projeto 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 />;
    }
}

Minha solução:

Basta salvar o soquete em um useState como este:

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

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

Problema resolvido.

No meu caso, a v2.3 está ok quando eu me conecto ao servidor socket.io local.
Mas ocorre erros quando me conecto ao servidor socket.io remoto.
A fonte do servidor é a mesma.
Portanto, eu faço o downgrade da versão do cliente socket.io para 2.1.1 e funciona bem.

Este aviso é gerado aqui por ReactNative/WebSocket.js:117 porque EngineIO (usado por SocketIO sob o capô) fará referência à implementação ReactNative WebSocket exposta via EngineIO/websocket.js:121 que é passado opts que contém as propriedades que a mensagem de aviso menciona. Curiosamente, essas propriedades adicionadas descritas pelos mantenedores do EngineIO por meio de comentário são "opções de SSL para o cliente Node.js".

Ao inserir algo como o código abaixo em EngineIO/websocket.js:114 para manipular o opts dado ao construtor WebSocket, removemos todas as chaves estranhas em opts para impedir com sucesso que o aviso apareça no primeiro lugar ( omit é importado de Lodash, pode ser retrabalhado).

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

Se você está procurando uma solução que não envolve simplesmente silenciar o aviso via YellowBox.ignoreWarnings então você pode substituir completamente o doOpen conforme definido EngineIO/websocket.js:87 adicionando algo assim abaixo , ao ponto de entrada do seu projeto 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);
  }
};

No geral, se criarmos uma solicitação pull para EngineIO para excluir esses opts extras que não são necessários quando usados ​​no ReactNative por meio de this.isReactNative , poderíamos suprimir este aviso para todos os que usam o cliente SocketIO em seus Projetos ReactNative.

Seu código não permitiu que eu me conectasse ao servidor e alterou o comportamento pretendido de EngineIO, então acabei de envolver essas opções em uma instrução if, mas usei o mesmo mecanismo de patch que você sugeriu

// 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 para "socket.io-client": "2.1.0" e tudo OK

Isso funcionou para mim.

Se bem entendi o problema, esse é um problema de dependências relacionado apresentado em https://github.com/socketio/socket.io-client/commit/06e9a4ca2621176c30c352b2ba8b34fa42b8d0ba?

O downgrade para 2.1.1 funciona de fato, mas estamos presos em lançamentos de dois anos.

O @ptboyer pode ser aplicado e liberado no projeto?

Este aviso afeta a funcionalidade do pacote? Basta configurá-lo e não quero ser impedido por isso. Fico feliz em ignorar se não tiver outras consequências

Edit: Para quem está se perguntando a mesma coisa. Pelo que posso dizer, este aviso é irrelevante.

@schumannd Esse problema é puramente sobre como silenciar a mensagem de erro / aviso. Funcionalmente, esse aviso é irrelevante. :)

+1

Estou muito preocupado se a biblioteca socket.io ainda é mantida ou não por causa de nenhuma resposta oficial sobre uma correção ou uma atualização futura.

+1

+1

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

@isthaison não funciona para mim

@isthaison para mim funciona ... mas todas as outras solicitações de http tornam-se muito lentas ... Não sei como isso está relacionado à solução alternativa ... mas é ...

{forceNode: true}

Obrigado. este trabalho para mim.

Esta é a única solução que funcionou para mim.

Este aviso é gerado aqui por ReactNative/WebSocket.js:117 porque EngineIO (usado por SocketIO sob o capô) fará referência à implementação ReactNative WebSocket exposta via EngineIO/websocket.js:121 que é passado opts que contém as propriedades que a mensagem de aviso menciona. Curiosamente, essas propriedades adicionadas descritas pelos mantenedores do EngineIO por meio de comentário são "opções de SSL para o cliente Node.js".
Ao inserir algo como o código abaixo em EngineIO/websocket.js:114 para manipular o opts dado ao construtor WebSocket, removemos todas as chaves estranhas em opts para impedir com sucesso que o aviso apareça no primeiro lugar ( omit é importado de Lodash, pode ser retrabalhado).

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

Se você está procurando uma solução que não envolve simplesmente silenciar o aviso via YellowBox.ignoreWarnings então você pode substituir completamente o doOpen conforme definido EngineIO/websocket.js:87 adicionando algo assim abaixo , ao ponto de entrada do seu projeto 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);
  }
};

No geral, se criarmos uma solicitação pull para EngineIO para excluir esses opts extras que não são necessários quando usados ​​no ReactNative por meio de this.isReactNative , poderíamos suprimir este aviso para todos os que usam o cliente SocketIO em seus Projetos ReactNative.

Seu código não permitiu que eu me conectasse ao servidor e alterou o comportamento pretendido de EngineIO, então acabei de envolver essas opções em uma instrução if, mas usei o mesmo mecanismo de patch que você sugeriu

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

Funciona comigo, obrigado!

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

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

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

Funciona comigo, obrigado!

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

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

Funcionou para mim também! Muito obrigado

Você pode simplesmente adicionar alguns cabeçalhos e funciona!
socket = io.connect('SOCKET_URL_HERE', { jsonp: false, agent: '-', pfx: '-', cert: '-', ca: '-', ciphers: '-', rejectUnauthorized: '-', perMessageDeflate: '-' });

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

Isso resolve o aviso, mas torna minha conexão de soquete realmente muito lenta (tempo limite, na verdade), portanto, não pode ser usada para mim.

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

Isso resolve o aviso, mas torna minha conexão de soquete realmente muito lenta (tempo limite, na verdade), portanto, não pode ser usada para mim.

mesmo aqui: tempo limite de conexão!

Eu me livrei do froceNode e rebaixei para 2.1.0 e funcionou bem. Eu também tive o problema de usar localhost e não o IP do meu dispositivo de emulador.

O mesmo @SaveYourTime , estou usando "socket.io-client": "^2.3.0"
consulte aqui https://socket.io/docs/client-api/.
Por que adicionar a opção forceNode

Este problema deve ser corrigido em engine.io-client v3.4.3, portanto, tudo que você precisa fazer é excluir o arquivo yarn.lock e o diretório node_modules , em seguida, executar yarn install

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

@BassemN Talvez em vez de excluir seu arquivo yarn.lock, você pudesse usar yarn upgrade-interactive para alterar a versão com segurança?

Parece um pouco contra-intuitivo para a ideia de um arquivo de "bloqueio" se você destruí-lo completamente toda vez que deseja atualizar seus pacotes. 😅

Deve ser corrigido por https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b (incluído em [email protected] e [email protected] ).

Com relação à opção forceNode , parece que o React Native realmente suporta WebSocket ( ref ), então forceNode: true não deve ser necessário. Não é esse o caso?

Esta página foi útil?
0 / 5 - 0 avaliações