عندما أقوم بتثبيت 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
مع التفاعل الأصلي
@ 2.1.1 على ما يرام. ولكن 2.3.0 تلقي رسالة تحذير على RN 0.61.1
أي حل حتى الآن
لا تزال مشكلة v2.3.0 مع التفاعل الأصلي
مرحبا شباب! لقد أصلحنا هذه المشكلة عن طريق الرجوع إلى الإصدار 2.1.1
تأكد من إزالة الإصدار الأقدم تمامًا ومسح ذاكرة التخزين المؤقت.
منجز! يجب أن يعمل هذا مع التفاعل الأصلي والويب التفاعلي الأصلي!
لدي نفس المشكلة مع 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
. أليس هذا هو الحال؟
التعليق الأكثر فائدة
بالنسبة لي ، نجح الأمر عندما خفضت تصنيفي إلى 2.1.1 فعلت:
yarn add [email protected]
في البداية لم ينجح ذلك لأنني كنت أضيف الرمز
^
قبل الإصدارsocket.io-client@^2.1.1
والذي أعتقد أنه يقبل الإصدارات الثانوية الأخرى من الحزمة.