Meteor 1.5.4.1服务端调用以太坊节点遇XHR2类型错误求助
解决Meteor 1.5.4.1中web3调用合约事件时的
XHR2 is not a function错误 错误根源
你遇到的这个错误,核心是旧版Meteor环境与ethereum:web3包的服务器端HttpProvider兼容性问题:
- Meteor 1.5.4.1对应的Node版本偏旧(大概是Node 8.x系列),而你安装的
ethereum:web3包在服务器端使用HttpProvider时,依赖的XHR2模块在这个旧Node环境里无法被正确识别为构造函数,导致调用时抛出TypeError。 - 简单来说,web3代码尝试用
new XHR2()创建请求,但当前环境里XHR2不是一个可调用的函数类型。
可行的解决方案
这里给你三个不同方向的解决办法,你可以根据自己的需求选择:
1. 切换到兼容的web3版本
尝试降级到与Meteor 1.5.4.1适配的web3版本,比如1.0.0-beta.34,这个版本对旧Node环境的兼容性更好:
# 先移除现有包 meteor remove ethereum:web3 # 安装指定兼容版本 meteor add ethereum:web3@1.0.0-beta.34
2. 替换为WebsocketProvider(推荐)
HttpProvider在旧环境下的问题较多,换成Websocket连接可以直接绕过XHR2的依赖问题:
修改你的lib.js代码:
if (typeof web3 === 'undefined'){ // 替换成你的以太坊节点websocket端口,默认是8546,这里根据你的实际配置调整 web3 = new Web3(new Web3.providers.WebsocketProvider('ws://127.0.0.1:21046')); }
注意要确保你的以太坊节点已经开启了Websocket服务,并且端口配置正确。
3. 手动补全XHR2依赖
如果一定要继续使用HttpProvider,可以手动安装并全局暴露XHR2模块:
- 首先在项目根目录执行npm安装:
npm install xhr2 --save
- 然后在
server/main.js的最顶部添加以下代码,确保web3能找到XHR2构造函数:
global.XHR2 = require('xhr2');
验证操作
修改完成后,重启Meteor服务:
meteor restart
之后再尝试调用合约事件监听代码,应该就不会再触发这个错误了。
内容的提问来源于stack exchange,提问作者user3131825
相关产品推荐
相关产品推荐

