Socket.io-client: Нераспознанные параметры подключения к WebSocket, `agent`,` perMessageDeflate`, `pfx`,` key`, `passphrase`,` cert`, `ca`,` ciphers`, `rejectUnauthorized`. Вы хотели поместить их в заголовки?

Созданный на 15 апр. 2019  ·  49Комментарии  ·  Источник: socketio/socket.io-client

Вы хотите:

  • [x] сообщить об ошибке
  • [] запросить функцию

Текущее поведение

Когда я устанавливаю 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 />;
    }
}

Самый полезный комментарий

Для меня это сработало, когда я снизился до 2.1.1, я сделал:
yarn add [email protected]

Сначала это не сработало, потому что я добавлял символ ^ перед версией socket.io-client@^2.1.1 которая, как я полагаю, принимает другие второстепенные версии пакета.

Все 49 Комментарий

Та же проблема :(

+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.

Убедитесь, что вы полностью удалили старую версию и очистили кеш.

  1. удалите socket.io-client из package.json, а лучше удалите файлы package-lock / yarn.lock.
  2. удалите всю папку node_modules (начните
  3. npm install socket.

Готово! Это должно работать с 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 не требуется. Разве это не так?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги