Ketika saya menginstal socket.io-client
pada proyek React Native Expo kosong, saya mendapat pesan kuning dengan:
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
Di App.js dalam proyek 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 />;
}
}
Permasalahan yang sama :(
+1
+1
+1
Tampaknya telah menjadi masalah setidaknya sejak 18 Desember
+1
+1
+1
+1
Saya masih mendapatkan peringatan ini saat menggunakan socket.io (2.2.0) di React-Native. Saya dapat membungkam kotak kuning di layar perangkat dengan:
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`?'
])
tapi saya masih mendapatkan peringatan yang mengganggu ini di konsol ...
downgrade ke "socket.io-client": "2.1.0" dan semuanya OK
Bagi saya itu berhasil ketika saya menurunkan versi ke 2.1.1 Saya melakukan:
yarn add [email protected]
Pada awalnya tidak berhasil karena saya menambahkan simbol ^
sebelum versi socket.io-client@^2.1.1
yang saya percaya menerima versi kecil lainnya dari paket tersebut.
Masih masalah @ 2.2.0
Coba turunkan socket.io-client ke 1.7.2, ini berfungsi untuk saya.
Masih masalah @ ^ 2.3.0
Masih masalah v2.3.0
dengan react-native
@ 2.1.1 OKE. Tapi 2.3.0 menampilkan pesan peringatan pada RN 0.61.1
solusi apa pun sampai sekarang
Masih masalah v2.3.0 dengan react-native
Hai teman-teman! Kami telah memperbaiki masalah ini dengan menurunkan versi ke v2.1.1
Pastikan Anda sepenuhnya menghapus versi lama dan menghapus cache.
Selesai! Ini harus bekerja dengan react-native & react-native-web!
Saya memiliki masalah yang sama dengan react-native: 0.61.4
tetapi entah bagaimana aplikasinya macet, saya tidak tahu apakah itu terjadi karena peringatan atau apakah itu hal lain yang berhubungan dengan soket, tetapi ketika saya mencoba menyambungkan ke soket, aplikasi ditutup.
Ini conf saya:
{
autoConnect: false,
reconnectionDelay: 1000,
reconnection: true,
transports: ['websocket'],
agent: false, // [2] Please don't set this to true
upgrade: false,
rejectUnauthorized: false
}
Apakah
socket.open
macet jika soket sudah terhubung?
Peringatan ini dimunculkan di sini oleh ReactNative/WebSocket.js:117
karena EngineIO (digunakan oleh SocketIO di bawah tenda) akan mereferensikan implementasi ReactNative WebSocket yang diekspos melalui EngineIO/websocket.js:121
yang diteruskan opts
yang berisi properti yang pesan peringatan menyebutkan. Anehnya, properti tambahan yang dijelaskan oleh pengelola EngineIO melalui komentar ini adalah "Opsi SSL untuk klien Node.js".
Dengan memasukkan sesuatu seperti kode di bawah ini pada EngineIO/websocket.js:114
untuk memanipulasi opts
diberikan kepada konstruktor WebSocket kami menghapus semua kunci asing di opts
agar berhasil menghentikan peringatan agar tidak muncul di tempat pertama ( omit
diimpor dari Lodash, dapat dikerjakan ulang).
// lib/transports/websocket.js
...
if (this.isReactNative) {
// prettier-ignore
opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']);
}
...
Jika Anda mencari solusi yang tidak melibatkan hanya mematikan peringatan melalui YellowBox.ignoreWarnings
maka Anda dapat sepenuhnya mengganti doOpen
sebagaimana ditentukan EngineIO/websocket.js:87
dengan menambahkan sesuatu seperti ini di bawah ini , ke titik masuk proyek ReactNative Anda, biasanya 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);
}
};
Secara keseluruhan, jika kita membuat permintaan tarik untuk EngineIO untuk mengecualikan tambahan opts
yang tidak diperlukan saat digunakan di ReactNative melalui this.isReactNative
maka kita dapat menekan peringatan ini untuk semua yang menggunakan Klien SocketIO di Proyek ReactNative.
Yang kamu ingin:
- [x] laporkan _bug_
- [] minta _feature_
Perilaku saat ini
Ketika saya menginstal
socket.io-client
pada proyek React Native Expo kosong, saya mendapat pesan kuning dengan:Unrecognized WebSocket connection option(s) `agent`, `perMessageDeflate`, `pfx`, `key`, `passphrase`, `cert`, `ca`, `ciphers`, `rejectUnauthorized`. Did you mean to put these under `headers`?
Langkah-langkah untuk mereproduksi (jika perilaku saat ini adalah bug)
yarn add socket.io-client
Di App.js dalam proyek 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 />; } }
Solusi Saya:
Simpan saja soket di useState seperti ini:
impor io dari 'socket.io-client';
// ...
const [socket] = useState(() => io('SERVER_URL'));
Masalah terpecahkan.
Dalam kasus saya, v2.3 baik-baik saja ketika saya terhubung ke server socket.io lokal.
Tapi itu terjadi kesalahan ketika saya terhubung ke server socket.io jarak jauh.
Sumber server sama.
Jadi saya menurunkan versi klien socket.io ke 2.1.1, dan itu berfungsi dengan baik.
Peringatan ini dimunculkan di sini oleh
ReactNative/WebSocket.js:117
karena EngineIO (digunakan oleh SocketIO di bawah tenda) akan mereferensikan implementasi ReactNative WebSocket yang diekspos melaluiEngineIO/websocket.js:121
yang diteruskanopts
yang berisi properti yang pesan peringatan menyebutkan. Anehnya, properti tambahan yang dijelaskan oleh pengelola EngineIO melalui komentar ini adalah "Opsi SSL untuk klien Node.js".Dengan memasukkan sesuatu seperti kode di bawah ini pada
EngineIO/websocket.js:114
untuk memanipulasiopts
diberikan kepada konstruktor WebSocket kami menghapus semua kunci asing diopts
agar berhasil menghentikan peringatan agar tidak muncul di tempat pertama (omit
diimpor dari Lodash, dapat dikerjakan ulang).// lib/transports/websocket.js ... if (this.isReactNative) { // prettier-ignore opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']); } ...
Jika Anda mencari solusi yang tidak melibatkan hanya mematikan peringatan melalui
YellowBox.ignoreWarnings
maka Anda dapat sepenuhnya menggantidoOpen
sebagaimana ditentukanEngineIO/websocket.js:87
dengan menambahkan sesuatu seperti ini di bawah ini , ke titik masuk proyek ReactNative Anda, biasanyaindex.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); } };
Secara keseluruhan, jika kita membuat permintaan tarik untuk EngineIO untuk mengecualikan tambahan
opts
yang tidak diperlukan saat digunakan di ReactNative melaluithis.isReactNative
maka kita dapat menekan peringatan ini untuk semua yang menggunakan Klien SocketIO di Proyek ReactNative.
Kode Anda tidak mengizinkan saya untuk terhubung ke server dan mengubah perilaku EngineIO yang dimaksudkan, jadi saya baru saja membungkus opsi tersebut dalam pernyataan if tetapi menggunakan mekanisme tambalan yang sama yang Anda sarankan
// 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();
};
downgrade ke "socket.io-client": "2.1.0" dan semuanya OK
Ini berhasil untuk saya.
Jika saya benar-benar memahami masalahnya, apakah ini masalah dependensi terkait yang diperkenalkan di https://github.com/socketio/socket.io-client/commit/06e9a4ca2621176c30c352b2ba8b34fa42b8d0ba?
Penurunan versi ke 2.1.1 memang berfungsi, tetapi kami terjebak pada rilis yang berusia dua tahun.
Dapatkah @ptboyer diterapkan dan dirilis pada proyek?
Apakah peringatan ini mempengaruhi fungsionalitas paket? Hanya mengaturnya dan tidak ingin ditahan oleh ini. Senang mengabaikannya jika tidak ada konsekuensi lain
Edit: Bagi siapa pun yang bertanya-tanya hal yang sama. Sejauh yang saya tahu, peringatan ini tidak penting.
@schumannd Masalah ini murni tentang
+1
Saya sangat khawatir tentang apakah pustaka socket.io masih dipertahankan atau tidak karena tidak ada balasan resmi tentang perbaikan atau pembaruan yang akan datang.
+1
+1
const _io = ioClient.connect(socketurl, { forceNode: true });
Ini berhasil
@isthaison Tidak berhasil untuk saya
@isthaison bagi saya itu berhasil ... tetapi setiap permintaan http lainnya menjadi sangat lambat ... Saya tidak tahu bagaimana ini terkait dengan penyelesaiannya ... tetapi itu ...
{forceNode: true}
Terima kasih. ini bekerja untuk saya.
Ini adalah satu-satunya solusi yang berhasil untuk saya.
Peringatan ini dimunculkan di sini oleh
ReactNative/WebSocket.js:117
karena EngineIO (digunakan oleh SocketIO di bawah tenda) akan mereferensikan implementasi ReactNative WebSocket yang diekspos melaluiEngineIO/websocket.js:121
yang diteruskanopts
yang berisi properti yang pesan peringatan menyebutkan. Anehnya, properti tambahan yang dijelaskan oleh pengelola EngineIO melalui komentar ini adalah "Opsi SSL untuk klien Node.js".
Dengan memasukkan sesuatu seperti kode di bawah ini padaEngineIO/websocket.js:114
untuk memanipulasiopts
diberikan kepada konstruktor WebSocket kami menghapus semua kunci asing diopts
agar berhasil menghentikan peringatan agar tidak muncul di tempat pertama (omit
diimpor dari Lodash, dapat dikerjakan ulang).// lib/transports/websocket.js ... if (this.isReactNative) { // prettier-ignore opts = omit(opts, ['agent', 'perMessageDeflate', 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers', 'rejectUnauthorized']); } ...
Jika Anda mencari solusi yang tidak melibatkan hanya mematikan peringatan melalui
YellowBox.ignoreWarnings
maka Anda dapat sepenuhnya menggantidoOpen
sebagaimana ditentukanEngineIO/websocket.js:87
dengan menambahkan sesuatu seperti ini di bawah ini , ke titik masuk proyek ReactNative Anda, biasanyaindex.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); } };
Secara keseluruhan, jika kita membuat permintaan tarik untuk EngineIO untuk mengecualikan tambahan
opts
yang tidak diperlukan saat digunakan di ReactNative melaluithis.isReactNative
maka kita dapat menekan peringatan ini untuk semua yang menggunakan Klien SocketIO di Proyek ReactNative.Kode Anda tidak mengizinkan saya untuk terhubung ke server dan mengubah perilaku EngineIO yang dimaksudkan, jadi saya baru saja membungkus opsi tersebut dalam pernyataan if tetapi menggunakan mekanisme tambalan yang sama yang Anda sarankan
// 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 });
Ini berhasil
Ini bekerja dengan saya, Terima kasih!
"socket.io-client": "^2.3.0"
const socket = io(host, { forceNode: true });
const _io = ioClient.connect(socketurl, { forceNode: true });
Ini berhasilIni bekerja dengan saya, Terima kasih!
"socket.io-client": "^2.3.0"
const socket = io(host, { forceNode: true });
Itu berhasil juga untuk saya! Terima kasih banyak
Anda cukup menambahkan beberapa tajuk dan berhasil!
socket = io.connect('SOCKET_URL_HERE', {
jsonp: false,
agent: '-',
pfx: '-',
cert: '-',
ca: '-',
ciphers: '-',
rejectUnauthorized: '-',
perMessageDeflate: '-'
});
const _io = ioClient.connect (socketurl, {forceNode: true});
Ini menyelesaikan peringatan tetapi membuat koneksi soket saya sangat lambat (sebenarnya waktu habis), jadi tidak dapat digunakan bagi saya.
const _io = ioClient.connect (socketurl, {forceNode: true});
Ini menyelesaikan peringatan tetapi membuat koneksi soket saya sangat lambat (sebenarnya waktu habis), jadi tidak dapat digunakan bagi saya.
sama di sini: batas waktu koneksi!
Saya menyingkirkan froceNode dan diturunkan menjadi 2.1.0
dan itu berfungsi dengan baik. Saya juga mengalami masalah ketika saya menggunakan localhost dan bukan IP ke perangkat emulator saya.
@SaveYourTime yang sama, saya menggunakan "socket.io-client": "^2.3.0"
lihat di sini https://socket.io/docs/client-api/.
Saya mengapa menambahkan opsi forceNode
Masalah ini harus diperbaiki pada engine.io-client
v3.4.3 jadi yang perlu Anda lakukan hanyalah menghapus file yarn.lock
dan direktori node_modules
lalu jalankan yarn install
ref https://github.com/socketio/engine.io-client/commit/2f5c948abe8fd1c0fdb010e88f96bd933a3792ea
@BassemN Mungkin daripada menghapus file yarn.lock Anda, Anda dapat menggunakan yarn upgrade-interactive
untuk mengubah versi dengan aman?
Tampaknya agak kontra-intuitif untuk gagasan file "kunci" jika Anda benar-benar menghancurkannya setiap kali Anda ingin memutakhirkan paket Anda. 😅
Ini harus diperbaiki oleh https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b (disertakan dalam [email protected]
dan [email protected]
).
Mengenai opsi forceNode
, tampaknya React Native sebenarnya mendukung WebSocket ( ref ), jadi forceNode: true
seharusnya tidak diperlukan. Bukankah itu masalahnya?
Komentar yang paling membantu
Bagi saya itu berhasil ketika saya menurunkan versi ke 2.1.1 Saya melakukan:
yarn add [email protected]
Pada awalnya tidak berhasil karena saya menambahkan simbol
^
sebelum versisocket.io-client@^2.1.1
yang saya percaya menerima versi kecil lainnya dari paket tersebut.