Socket.io-client: 无法识别的WebSocket连接选项`agent`,`perMessageDeflate`,`pfx`,`key`,`passphrase`,`cert`,`ca`,`ciphers,`rejectUnauthorized`。 您是要把这些放在“标题”下吗?

创建于 2019-04-15  ·  49评论  ·  资料来源: socketio/socket.io-client

你想要:

  • [x]报告错误
  • []请求功能

当前行为

当我在一个空白的React Native Expo项目上安装socket.io-client ,我看到一条黄色消息:

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

在React Native项目的App.js中:

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

自从至少12月18日以来,似乎就一直是一个问题

+1

+1

+1

+1

在React-Native上使用socket.io(2.2.0)时,我仍然收到此警告。 我可以使用以下方法使设备屏幕上的黄色框静音:

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

React-native仍然是一个问题v2.3.0

@ 2.1.1可以。 但是2.3.0在RN 0.61.1上引发警告消息

到现在为止任何解决方案

v2.3.0仍然是react-native的问题

大家好! 我们通过降级到v2.1.1解决了这个问题

确保完全删除旧版本并清除缓存。

  1. 从package.json中删除socket.io-client并更好地删除您的package-lock / yarn.lock文件。
  2. 删除整个node_modules文件夹(重新开始)
  3. npm安装套接字。

做完了! 这应该适用于react-native和react-native-web!

我在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在后台使用)将通过EngineIO/websocket.js:121引用公开的ReactNative WebSocket实现,该实现传递给opts ,其中包含以下属性:警告消息中提到。 奇怪的是,EngineIO维护人员通过注释描述的这些添加的属性是“ Node.js客户端的SSL选项”。

通过在EngineIO/websocket.js:114处插入类似以下代码的代码来操纵提供给WebSocket构造函数的opts ,我们删除了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创建一个拉取请求,以排除通过this.isReactNative在ReactNative中使用时不需要的这些额外的opts ,那么我们可以在所有使用SocketIO Client的用户中取消此警告ReactNative项目。

你想要:

  • [x]报告一个_bug_
  • []请求_feature_

当前行为

当我在一个空白的React Native Expo项目上安装socket.io-client ,我看到一条黄色消息:

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

在React Native项目的App.js中:

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中,如下所示:

从'socket.io-client'导入io;
// ...

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

问题解决了。

就我而言,当我连接到本地socket.io服务器时,v2.3可以。
但是,当我连接到远程socket.io服务器时,它会发生错误。
服务器源是相同的。
所以我将socket.io客户端版本降级到2.1.1,并且工作正常。

此警告在这里由ReactNative/WebSocket.js:117引发,因为EngineIO(由SocketIO在后台使用)将通过EngineIO/websocket.js:121引用公开的ReactNative WebSocket实现,该实现传递给opts ,其中包含以下属性:警告消息中提到。 奇怪的是,EngineIO维护人员通过注释描述的这些添加的属性是“ Node.js客户端的SSL选项”。

通过在EngineIO/websocket.js:114处插入类似以下代码的代码来操纵提供给WebSocket构造函数的opts ,我们删除了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创建一个拉取请求,以排除通过this.isReactNative在ReactNative中使用时不需要的这些额外的opts ,那么我们可以在所有使用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在后台使用)将通过EngineIO/websocket.js:121引用公开的ReactNative WebSocket实现,该实现传递给opts ,其中包含以下属性:警告消息中提到。 奇怪的是,EngineIO维护人员通过注释描述的这些添加的属性是“ Node.js客户端的SSL选项”。
通过在EngineIO/websocket.js:114处插入类似以下代码的代码来操纵提供给WebSocket构造函数的opts ,我们删除了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创建一个拉取请求,以排除通过this.isReactNative在ReactNative中使用时不需要的这些额外的opts ,那么我们可以在所有使用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 upgrade-interactive安全删除版本,而不是删除yarn.lock文件?

如果每次要升级软件包时都将其完全销毁,则似乎与“锁定”文件的想法有点直觉。 😅

应该通过https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b (包含在[email protected][email protected] )进行修复。

关于forceNode选项,似乎React Native实际上支持WebSocket( ref ),因此不需要forceNode: true 。 不是这样吗

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

najibghadri picture najibghadri  ·  7评论

patrickbussmann picture patrickbussmann  ·  6评论

ahadcove picture ahadcove  ·  7评论

crazyyi picture crazyyi  ·  5评论

catamphetamine picture catamphetamine  ·  3评论