我有2台具有完全相同设置的服务器。但是在1台服务器上,我遇到了一个错误而在另一台服务器上运行良好。
在服务器1上:
[root@tst socketio]# npm list socket.io
/var/socketio
└── socket.io@2.0.4
Package nodejs-0.10.48-3.el6.x86_64 already installed and latest version
在服务器2上:
[root@1 socketio]# npm list socket.io
/var/socketio
└── socket.io@2.0.4
Package nodejs-0.10.48-3.el6.x86_64 already installed and latest version
服务器1上的脚本:
[root@tst socketio]# node /var/socketio/socketioclient.js 1768
Time: 5/3/2018 21:10:6
ID: 1768
Start connect
S-connection
k95RAgJVnhzv4ItHABvu
S-emit event
S-disconnect
服务器2上的脚本:
[root@1 socketio]# node /var/socketio/socketioclient.js 1768
Time: 5/3/2018 20:59:24
ID: 1768
/var/socketio/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js:66
var headers = Object.assign({}, defaultHeaders);
^
TypeError: Object function Object() { [native code] } has no method 'assign'
at new XMLHttpRequest (/var/socketio/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js:66:24)
at /var/socketio/node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/polling.js:24:13
at Object.<anonymous> (/var/socketio/node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/polling.js:26:3)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/var/socketio/node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/polling-xhr.js:6:15)
我的socketioclient.js:
console.log(datetime);
console.log('ID: '+ID);
var io = require('socket.io-client');
console.log('Start connect');
var sSocket = io.connect('https://11.22.33.44:1234', {
reconnection: true,
reconnectionDelay: 1000,
reconnectionDelayMax : 5000,
reconnectionAttempts: 3
});
sSocket.on('connect', function (data) {
console.log('S-connection');
console.log(sSocket.id);
console.log('S-emit event');
sSocket.emit('event', { ID: ID });
sSocket.disconnect();
}
sSocket.on('serveroutput', function (data) {
console.log('S-serveroutput: '+data);
});
});
sSocket.on('disconnect', function (data) {
console.log('S-disconnect');
});
sSocket.on('reconnect', function() {
console.log('S-reconnecting');
});
sSocket.on('reconnect_failed', function (data) {
console.log('S-reconnect failed');
});
我认为socketio版本或nodejs版本没有区别。但结果却不同。怎么样?
我已阅读(在此网站上)有关需要节点版本&gt; = 4.但由于它在1台服务器上工作,我认为这不是问题。
答案 0 :(得分:1)
tl; dr 升级到最新Node LTS release(目前为8)
看起来您有xmlhttprequest-ssl
的不同版本,即使父socket.io
为2.0.4。 xmlhttprequest-ssl
版本1.5.4或更新版本包括Object.assign
的使用。 1.5.2版本的版本可能在Node 0.10中工作得更好。
如果查看堆栈跟踪中的路径,则错误中涉及socket.io
以外的许多模块:
socket.io-client/node_modules/engine.io-client/node_modules/xmlhttprequest-ssl
节点0.10上支持的npm
命令是非确定性的,这意味着您最终可以安装两个相同父模块的安装,但它们由不同的子依赖项组成。这在很大程度上取决于您运行npm install
时获得的版本。
npm
(5.x)和yarn
package manager的最新版本现在支持完全描述应用程序依赖关系的锁定文件,并且能够随着时间的推移创建一致的安装。
许多模块已经开始放弃对4.x之前的任何Node版本的支持,因此这种类型的错误对于Node 0.x用户来说将变得越来越普遍。
使用当前的Long Term Support release of Node。如果您需要packages for your RHEL platform,Nodesource provide rpms。