Socket.io-client: خيار (خيارات) اتصال WebSocket غير معروف ، `agent` ،` perMessageDeflate` ، `pfx` ،` key` ، `passphrase` ،` cert` ، `ca` ،` ciphers` ، `رفضUnauthorized`. هل قصدت وضع هذه تحت "رؤوس"؟

تم إنشاؤها على ١٥ أبريل ٢٠١٩  ·  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 />;
    }
}
bug

التعليق الأكثر فائدة

بالنسبة لي ، نجح الأمر عندما خفضت تصنيفي إلى 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 مع التفاعل الأصلي

@ 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 تثبيت المقبس.

منجز! يجب أن يعمل هذا مع التفاعل الأصلي والويب التفاعلي الأصلي!

لدي نفس المشكلة مع react-native: 0.61.4 لكن التطبيق يتعطل بطريقة ما ، لا أعرف ما إذا كان يحدث بسبب التحذير أو ما إذا كان شيئًا آخر متعلقًا بالمقبس ، ولكن عندما حاولت الاتصال بالمقبس يغلق التطبيق.

هذا هو بلدي 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 إذا كان المقبس متصلاً بالفعل؟

تم رفع هذا التحذير هنا بواسطة 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 />;
    }
}

بلدي الحل:

فقط احفظ المقبس في حالة استخدام مثل هذا:

استيراد io من "socket.io-client" ؛
// ...

const [socket] = useState(() => io('SERVER_URL'));

تم حل المشكلة.

في حالتي ، يكون الإصدار 2.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 وعملت بشكل جيد. لدي أيضًا مشكلة حيث كنت أستخدم المضيف المحلي وليس 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 ( المرجع ) ، لذا لا حاجة إلى forceNode: true . أليس هذا هو الحال؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات