Socket.io-client: Opsi koneksi WebSocket tidak dikenal `agent`,` perMessageDeflate`, `pfx`,` key`, `passphrase`,` cert`, `ca`,` ciphers`, `rejectUnauthorized`. Apakah Anda bermaksud meletakkan ini di bawah `header`?

Dibuat pada 15 Apr 2019  ·  49Komentar  ·  Sumber: socketio/socket.io-client

Yang kamu ingin:

  • [x] laporkan bug
  • [] minta fitur

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 />;
    }
}
bug

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 versi socket.io-client@^2.1.1 yang saya percaya menerima versi kecil lainnya dari paket tersebut.

Semua 49 komentar

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.

  1. hapus socket.io-client dari package.json & lebih baik hapus file package-lock / yarn.lock Anda.
  2. hapus seluruh folder node_modules Anda (mulai dari awal)
  3. npm instal soket.

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

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

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 berhasil

Ini 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?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

david-fong picture david-fong  ·  4Komentar

catamphetamine picture catamphetamine  ·  3Komentar

najibghadri picture najibghadri  ·  7Komentar

yesterday24 picture yesterday24  ·  4Komentar

Sairyss picture Sairyss  ·  4Komentar