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`?
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 />;
}
}
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é.
¡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 deEngineIO/websocket.js:121
que se pasaopts
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 elopts
dado al constructor de WebSocket, eliminamos todas las claves extrañas enopts
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 completamentedoOpen
como se defineEngineIO/websocket.js:87
agregando algo como esto a continuación , al punto de entrada de su proyecto 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); } };
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 dethis.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 deEngineIO/websocket.js:121
que se pasaopts
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 enEngineIO/websocket.js:114
para manipular elopts
dado al constructor de WebSocket, eliminamos todas las claves extrañas enopts
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 completamentedoOpen
como se defineEngineIO/websocket.js:87
agregando algo como esto a continuación , al punto de entrada de su proyecto 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); } };
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 dethis.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 trabajoFunciona 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?
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ónsocket.io-client@^2.1.1
que creo que acepta otras versiones menores del paquete.