Node.js socket.io:TypeError Object(){[native code]}没有方法'assign'

时间:2018-03-05 20:25:54

标签: node.js socket.io

我有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台服务器上工作,我认为这不是问题。

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