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`?
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 />;
}
}
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.
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 viaEngineIO/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 leopts
donné au constructeur WebSocket, nous supprimons toutes les clés superflues dansopts
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 ledoOpen
tel que définiEngineIO/websocket.js:87
en ajoutant quelque chose comme ceci ci-dessous , au point d'entrée de votre projet ReactNative, généralementindex.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 viathis.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 viaEngineIO/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 leopts
donné au constructeur WebSocket, nous supprimons toutes les clés superflues dansopts
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 ledoOpen
tel que définiEngineIO/websocket.js:87
en ajoutant quelque chose comme ceci ci-dessous , au point d'entrée de votre projet ReactNative, généralementindex.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 viathis.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 travailCela 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?
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 versionsocket.io-client@^2.1.1
qui, je crois, accepte d'autres versions mineures du package.