Когда я устанавливаю socket.io-client
в пустой проект React Native Expo, у меня появляется желтое сообщение:
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
В App.js в проекте 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 />;
}
}
Та же проблема :(
+1
+1
+1
Кажется, это проблема, по крайней мере, еще с 18 декабря.
+1
+1
+1
+1
Я все еще получаю это предупреждение при использовании socket.io (2.2.0) в React-Native. Я могу отключить желтый квадрат на экране устройства с помощью:
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`?'
])
но я все еще получаю это раздражающее предупреждение на консоли ...
перейти на "socket.io-client": "2.1.0" и все в порядке
Для меня это сработало, когда я снизился до 2.1.1, я сделал:
yarn add [email protected]
Сначала это не сработало, потому что я добавлял символ ^
перед версией socket.io-client@^2.1.1
которая, как я полагаю, принимает другие второстепенные версии пакета.
Все еще проблема @ 2.2.0
Попробуйте понизить версию socket.io-client до версии 1.7.2, у меня это работает.
По-прежнему проблема @ ^ 2.3.0
Все еще проблема v2.3.0
с react-native
@ 2.1.1 в порядке. Но 2.3.0 выдает предупреждающее сообщение на RN 0.61.1
любое решение до сих пор
По-прежнему проблема v2.3.0 с реагированием
Эй, ребята! Мы устранили эту проблему, 2.1.1.
Убедитесь, что вы полностью удалили старую версию и очистили кеш.
Готово! Это должно работать с react-native и react-native-web!
У меня такая же проблема с react-native: 0.61.4
но почему-то приложение вылетает, я не знаю, происходит ли это из-за предупреждения или связано с другой проблемой, связанной с сокетом, но когда я попытался подключиться к сокету, приложение закрывается.
Это мой конф:
{
autoConnect: false,
reconnectionDelay: 1000,
reconnection: true,
transports: ['websocket'],
agent: false, // [2] Please don't set this to true
upgrade: false,
rejectUnauthorized: false
}
Вылетает ли
socket.open
если сокет уже подключен?
Это предупреждение вызывается здесь ReactNative/WebSocket.js:117
потому что EngineIO (используемый SocketIO под капотом) будет ссылаться на открытую реализацию ReactNative WebSocket через EngineIO/websocket.js:121
который передается opts
который содержит свойства, которые предупреждающее сообщение упоминает. Любопытно, что эти добавленные свойства, описанные разработчиками EngineIO в комментариях, являются «параметрами SSL для клиента Node.js».
Вставив что-то вроде приведенного ниже кода в EngineIO/websocket.js:114
для управления opts
заданным конструктору WebSocket, мы удаляем все посторонние ключи в opts
чтобы предотвратить появление предупреждения в первое место ( omit
импортировано из Lodash, можно переработать).
// lib/transports/websocket.js
...
if (this.isReactNative) {
// prettier-ignore
opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']);
}
...
Если вы ищете решение, которое не включает простое отключение предупреждения с помощью YellowBox.ignoreWarnings
тогда вы можете полностью переопределить doOpen
как определено EngineIO/websocket.js:87
, добавив что-то вроде этого ниже , в точку входа вашего проекта ReactNative, обычно 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);
}
};
В целом, если мы создадим пул-реквест для EngineIO, чтобы исключить эти лишние opts
, которые не нужны при использовании в ReactNative через this.isReactNative
то мы могли бы подавить это предупреждение для всех, кто использует SocketIO Client в их ReactNative проекты.
Вы хотите:
- [x] сообщить об _bug_
- [] запросить _функцию_
Текущее поведение
Когда я устанавливаю
socket.io-client
в пустой проект React Native Expo, у меня появляется желтое сообщение: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
В App.js в проекте 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 />; } }
Мое решение:
Просто сохраните сокет в useState следующим образом:
импортировать io из socket.io-client;
// ...
const [socket] = useState(() => io('SERVER_URL'));
Задача решена.
В моем случае v2.3 в порядке, когда я подключаюсь к локальному серверу socket.io.
Но при подключении к удаленному серверу socket.io возникают ошибки.
Источник сервера такой же.
Поэтому я понизил версию клиента socket.io до 2.1.1, и она отлично работает.
Это предупреждение вызывается здесь
ReactNative/WebSocket.js:117
потому что EngineIO (используемый SocketIO под капотом) будет ссылаться на открытую реализацию ReactNative WebSocket черезEngineIO/websocket.js:121
который передаетсяopts
который содержит свойства, которые предупреждающее сообщение упоминает. Любопытно, что эти добавленные свойства, описанные разработчиками EngineIO в комментариях, являются «параметрами SSL для клиента Node.js».Вставив что-то вроде приведенного ниже кода в
EngineIO/websocket.js:114
для управленияopts
заданным конструктору WebSocket, мы удаляем все посторонние ключи вopts
чтобы предотвратить появление предупреждения в первое место (omit
импортировано из Lodash, можно переработать).// lib/transports/websocket.js ... if (this.isReactNative) { // prettier-ignore opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']); } ...
Если вы ищете решение, которое не включает простое отключение предупреждения с помощью
YellowBox.ignoreWarnings
тогда вы можете полностью переопределитьdoOpen
как определеноEngineIO/websocket.js:87
, добавив что-то вроде этого ниже , в точку входа вашего проекта ReactNative, обычно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); } };
В целом, если мы создадим пул-реквест для EngineIO, чтобы исключить эти лишние
opts
, которые не нужны при использовании в ReactNative черезthis.isReactNative
то мы могли бы подавить это предупреждение для всех, кто использует SocketIO Client в их ReactNative проекты.
Ваш код не позволит мне подключиться к серверу и изменить предполагаемое поведение EngineIO, поэтому я просто заключил эти параметры в оператор if, но использовал тот же механизм исправлений, который вы предложили
// 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();
};
перейти на "socket.io-client": "2.1.0" и все в порядке
Это сработало для меня.
Если я хорошо понимаю проблему, не связана ли эта проблема с зависимостями в https://github.com/socketio/socket.io-client/commit/06e9a4ca2621176c30c352b2ba8b34fa42b8d0ba?
Понижение до 2.1.1 действительно работает, но мы застряли на выпусках двухлетней давности.
Можно ли применить @ptboyer и выпустить его в проекте?
Влияет ли это предупреждение на функциональность пакета? Просто настраиваю и не хочу, чтобы это меня сдерживало. С удовольствием проигнорирую, если у этого нет других последствий
Изменить: для всех, кому интересно то же самое. Насколько я могу судить, это предупреждение несущественно.
@schumannd Эта проблема
+1
Меня очень беспокоит, поддерживается ли библиотека socket.io по-прежнему или нет из-за отсутствия официального ответа об исправлении или предстоящем обновлении.
+1
+1
const _io = ioClient.connect(socketurl, { forceNode: true });
Это работает
@isthaison У меня не работает
@isthaison для меня это работает ... но каждый другой HTTP-запрос становится очень медленным ... Я не знаю, как это связано с обходным путем ... но это ...
{forceNode: true}
Спасибо. эта работа для меня.
Это единственное решение, которое у меня сработало.
Это предупреждение вызывается здесь
ReactNative/WebSocket.js:117
потому что EngineIO (используемый SocketIO под капотом) будет ссылаться на открытую реализацию ReactNative WebSocket черезEngineIO/websocket.js:121
который передаетсяopts
который содержит свойства, которые предупреждающее сообщение упоминает. Любопытно, что эти добавленные свойства, описанные разработчиками EngineIO в комментариях, являются «параметрами SSL для клиента Node.js».
Вставив что-то вроде приведенного ниже кода вEngineIO/websocket.js:114
для управленияopts
заданным конструктору WebSocket, мы удаляем все посторонние ключи вopts
чтобы предотвратить появление предупреждения в первое место (omit
импортировано из Lodash, можно переработать).// lib/transports/websocket.js ... if (this.isReactNative) { // prettier-ignore opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']); } ...
Если вы ищете решение, которое не включает простое отключение предупреждения с помощью
YellowBox.ignoreWarnings
тогда вы можете полностью переопределитьdoOpen
как определеноEngineIO/websocket.js:87
, добавив что-то вроде этого ниже , в точку входа вашего проекта ReactNative, обычно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); } };
В целом, если мы создадим пул-реквест для EngineIO, чтобы исключить эти лишние
opts
, которые не нужны при использовании в ReactNative черезthis.isReactNative
то мы могли бы подавить это предупреждение для всех, кто использует SocketIO Client в их ReactNative проекты.Ваш код не позволит мне подключиться к серверу и изменить предполагаемое поведение EngineIO, поэтому я просто заключил эти параметры в оператор if, но использовал тот же механизм исправлений, который вы предложили
// 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 });
Это работает
У меня работает, спасибо!
"socket.io-client": "^2.3.0"
const socket = io(host, { forceNode: true });
const _io = ioClient.connect(socketurl, { forceNode: true });
Это работаетУ меня работает, спасибо!
"socket.io-client": "^2.3.0"
const socket = io(host, { forceNode: true });
У меня тоже получилось! Большое спасибо
Вы можете просто добавить несколько заголовков, и это работает!
socket = io.connect('SOCKET_URL_HERE', {
jsonp: false,
agent: '-',
pfx: '-',
cert: '-',
ca: '-',
ciphers: '-',
rejectUnauthorized: '-',
perMessageDeflate: '-'
});
const _io = ioClient.connect (socketurl, {forceNode: true});
Это устраняет предупреждение, но делает мое соединение с сокетом очень медленным (на самом деле тайм-аут), поэтому его нельзя использовать для меня.
const _io = ioClient.connect (socketurl, {forceNode: true});
Это устраняет предупреждение, но делает мое соединение с сокетом очень медленным (на самом деле тайм-аут), поэтому его нельзя использовать для меня.
то же самое здесь: тайм-аут соединения!
Я избавился от froceNode и понизил до 2.1.0
и он работал нормально. У меня также была проблема, когда я использовал localhost, а не IP-адрес своего эмулятора.
Тот же @SaveYourTime , я использую "socket.io-client": "^2.3.0"
обратитесь сюда https://socket.io/docs/client-api/.
Зачем добавлять опцию forceNode
Эта проблема должна быть исправлена в engine.io-client
v3.4.3, поэтому все, что вам нужно сделать, это удалить файл yarn.lock
каталог node_modules
затем запустить yarn install
ссылка https://github.com/socketio/engine.io-client/commit/2f5c948abe8fd1c0fdb010e88f96bd933a3792ea
@BassemN Возможно, вместо удаления файла yarn.lock вы могли бы использовать yarn upgrade-interactive
чтобы безопасно поднять версию?
Это кажется немного нелогичным по отношению к идее «файла блокировки», если вы полностью уничтожаете его каждый раз, когда хотите обновить свои пакеты. 😅
Это должно быть исправлено https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b (включено в [email protected]
и [email protected]
).
Что касается опции forceNode
, похоже, что React Native действительно поддерживает WebSocket ( ref ), поэтому forceNode: true
не требуется. Разве это не так?
Самый полезный комментарий
Для меня это сработало, когда я снизился до 2.1.1, я сделал:
yarn add [email protected]
Сначала это не сработало, потому что я добавлял символ
^
перед версиейsocket.io-client@^2.1.1
которая, как я полагаю, принимает другие второстепенные версии пакета.