Node.js web3.eth.subscribe未针对web3版本1.0.0-beta.27实施

Node.js web3.eth.subscribe未针对web3版本1.0.0-beta.27实施,node.js,blockchain,ethereum,web3,Node.js,Blockchain,Ethereum,Web3,我使用的是web3版本1.0.0-beta.27,我正在运行一个私有以太坊区块链进行测试。区块链正在挖掘,有两个用户,现在我想订阅区块链中的事件并执行一些操作。代码如下: var Web3 = require("web3"); var ether_port = 'http://localhost:8545' var web3 = new Web3(new Web3.providers.HttpProvider(ether_port)); web3.eth.subscri

我使用的是web3版本
1.0.0-beta.27
,我正在运行一个私有以太坊区块链进行测试。区块链正在挖掘,有两个用户,现在我想订阅区块链中的事件并执行一些操作。代码如下:

var Web3 = require("web3");     

var ether_port = 'http://localhost:8545'
var web3       = new Web3(new Web3.providers.HttpProvider(ether_port));

web3.eth.subscribe("pendingTransactions"
                  , function(err, result){
    if (err){ console.log(err) }
    else { console.log("result: ", result) }
});
我得到的结果是:

Error: The current provider doesn't support subscriptions: HttpProvider
at Subscription.subscribe 
从某种意义上说并不奇怪,因为当我在
node.js
控制台上订阅
web3.eth.subscribe
时,我得到:

{ [Function] call: undefined }
尽管
web3-1.0.0
的文档中说明了可以使用该函数:

  • 那么,这只是文档与实际实现不同步的问题吗?我用错了吗

  • 如果没有实施,那么听取链中变化的最佳方式是什么?例如,如果我想实时更新用户的帐户余额?除此之外,还有一个简单的函数实现,该函数每隔
    n
    几秒钟ping一次链


  • 正如错误所提示的,发布/订阅在HTTP上不可用。但是,您可以通过WS使用它。因此,您引用的文档并非100%错误,它只是省略了代码的提供者部分

    尝试使用web套接字连接启动节点(
    geth--ws--wsport 8545…
    ,假设您使用的是
    geth
    ),并更改为
    WebsocketProvider

    var Web3 = require("web3");     
    
    var ether_port = 'ws://localhost:8545'
    var web3       = new Web3(new Web3.providers.WebsocketProvider(ether_port));
    
    web3.eth.subscribe("pendingTransactions"
                      , function(err, result){
        if (err){ console.log(err) }
        else { console.log("result: ", result) }
    });
    

    请参阅第4条评论。

    使用附加的JS控制台打开它的更好方法

    您可以使用>geth attach“ipc路径”(即在我的示例中是/home/dev/.ethereum/geth.ipc)来连接它

    之后,您将连接到正在运行的geth节点并使用管理API的。。现在你可以使用

    admin.startWS(“本地主机”,“端口号”)

    当你想关闭连接时,你可以使用下面的命令

    admin.stopWS()

    问候
    Dev

    你能帮我找到在geth中打开websocket的正确方法吗。当执行
    geth--identity“node”-nodiscover--maxpeers 0--datadir/path/to/data--networkid 123--ws--wsport 8546控制台
    ,然后尝试在节点中打开连接时,我得到了
    WARN[01-09 | 14:54:48]origin''在ws-RPC接口上不允许
    。try
    geth--identity“node”--nodiscover--maxpeers 0--datadir/path/to/data--networkid 123--ws--wsport 8545--wsaddr 0.0.0.0--wsorigins“*”控制台
    。请注意,我使用端口8545匹配答案中的代码。很明显,你想用什么就用什么。啊,效果很好,谢谢。最后一个问题,为什么当我在浏览器中导航到
    ws://127.0.0.1:8546/
    (我最终用于ws-port的地址)时,无法访问此站点。但我可以导航到
    http://127.0.0.1:8546/
    当我打开
    http
    端口时?我不确定。我从未尝试通过浏览器通过ws来点击它。我建议使用web套接字插件来获取更多信息。此外,您还可以同时启用JSON-RPC(HTTP)和WS-connections。只需在不同的端口上运行它们。我还应该提到,如果您需要访问eth/web3/net以外的LIB,并且对HTTP/WS有安全顾虑,那么您应该能够通过IPC进行发布/订阅。