Problem
我想有一个网站,通过私人以太坊区块链更新用户的财富 .
Current Solution (broken)
我打开一个websocket到一个私有的以太坊区块链,我想在前端更新我的coinbase余额 . 我的代码如下:
const express = require("express");
const Web3 = require("web3");
var app = express();
app.get("/", (req, res) => res.send("hello world from ping ether application"));
app.get("/ping-ether", function(req, res){
var web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
var event_newBlockHeaders = web3.eth.subscribe("newBlockHeaders", function(err, result){
if (err){
console.log(err)
} else {
let acctPromise = web3.eth.getAccounts().then(function(accts){
let balance = web3.eth.getBalance(accts[0]).then(function(bal){
console.log("user: ", accts[0]);
console.log("balance: ", bal);
res.end("new balance for user: " + bal)
});
});
}
});
});
// run the server
app.listen(3000, () => console.log("web app listening on port 3000"));
很明显,这并不是在前端更新,即使最内部的回调是持续不断的,因为我可以在控制台上确认 . 我想要三件事:
-
如何更改此代码,以便前端具有coinbase余额的实时代码
-
一般来说代码的嵌套承诺闻起来很糟糕 . 我如何重构它以便每次导航到
/ping-ether
时都不必 Build websocket连接? -
欢迎任何其他建议 . 我很新
node.js
2 回答
未经测试,但这样的事情应该有效:
主要思想是设置websocket连接和订阅一次,然后只使用当前余额响应传入的Web请求 . 我还尝试通过返回订阅承诺来清理嵌套的promises .
更新:我最终使用websocket,这是解决方案:
这是index.html .