当我在一个空白的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 />;
}
}
同样的问题 :(
+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解决了这个问题
确保完全删除旧版本并清除缓存。
做完了! 这应该适用于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
。 不是这样吗
最有用的评论
对我来说,当我降级到2.1.1时,它起作用了:
yarn add [email protected]
起初,它没有工作,因为我加入
^
之前的版本符号socket.io-client@^2.1.1
,我相信接受程序包的其他次要版本。