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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js socket.io:TypeError Object(){[native code]}没有方法'assign'相关的知识,希望对你有一定的参考价值。

我有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版本没有区别。但结果却不同。怎么会 ?

我已经阅读(在这个网站上)有关需要节点版本> = 4.但是因为它适用于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

以上是关于Node.js socket.io:TypeError Object(){[native code]}没有方法'assign'的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 状态代码 200 但页面未加载 Node.js Socket.io -- 使用 Socket.io 的 Node.js 教程,Daniel Nill,fs.readFile(),socket

Node.js 和 socket.io 的混淆

Node.js socket.io.js 未找到或 io 未定义

找不到Node.js /socket.io/socket.io.js express 4.0

node.js + socket.io:拍卖网站开发

Heroku 上的 socket.io + node.js