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`?
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 />;
}
}
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.
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 viaEngineIO/websocket.js:121
que é passadoopts
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 oopts
dado ao construtor WebSocket, removemos todas as chaves estranhas emopts
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 odoOpen
conforme definidoEngineIO/websocket.js:87
adicionando algo assim abaixo , ao ponto de entrada do seu projeto ReactNative, normalmenteindex.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 dethis.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 viaEngineIO/websocket.js:121
que é passadoopts
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 emEngineIO/websocket.js:114
para manipular oopts
dado ao construtor WebSocket, removemos todas as chaves estranhas emopts
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 odoOpen
conforme definidoEngineIO/websocket.js:87
adicionando algo assim abaixo , ao ponto de entrada do seu projeto ReactNative, normalmenteindex.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 dethis.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 funcionaFunciona 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?
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ãosocket.io-client@^2.1.1
que acredito aceitar outras versões secundárias do pacote.