【问题标题】:Nodejs return result from function is empty promiseNodejs从函数返回结果是空的承诺
【发布时间】:2020-03-06 14:13:51
【问题描述】:

我正在尝试使用 Nodejs tron 库来创建一对钱包地址,这是我的代码:

app.js

var app = require('express')()
var http = require('http').createServer(app)
var wallet_engine = require('./function')
app.get('/', function (req, res) {
    result = wallet_engine.create_wallet_trx()
    console.log(result)
    res.send(result)
})
//////server listen
http.listen(8443, function () {
    console.log('listening on *:8443')
})

这是我的function.js

module.exports = {
    create_wallet_trx: function () {
////////generate TRX Address
        var { HdTronPayments } = require('@faast/tron-payments')
        var keys = HdTronPayments.generateNewKeys()
        var tronPayments = new HdTronPayments({ hdKey: keys.xprv })
        var address = tronPayments.getPayport(356)
        var privateKey = tronPayments.getPrivateKey(356)
        var trx_wallet = { privateKey: privateKey, address: address }
        console.log(trx_wallet)
        return trx_wallet
    },
}

问题是当我检查 console.log(trx_wallet) 结果就在那里,我可以看到生成的公钥和私钥,同样在返回数据后,console.log(result) 正在显示数据,但是 res.send(result ) 显示空的 json。

这是 console.log() 结果

{
  privateKey: Promise {
    'B88BB56DAB80DB681765A0C07197DD23BB8E2FAD195BF9D0ECD09F5F8FC54297'
  },
  address: Promise { { address: 'TYCJSKERHReUXacw9wLorZYLDoijevvsVK' } }
}

这是我浏览器上的结果:

{"privateKey":{},"address":{}}

我知道这是因为 Nodejs 异步系统,我应该等待 promise 获取值,但我不知道如何等待 promise 完成,然后在我的浏览器屏幕上打印结果。

【问题讨论】:

  • 它们是您尝试JSON.stringify 的承诺对象。等待他们的结果,然后发送。
  • 你不能相信console.log 的输出,至少不能相信你展开它时看到的,因为控制台经常会异步检索这部分......稍后。
  • @jonrsharpe 我之前尝试过您提供的链接中的方法,但它导致浏览器永远加载。我这样做了:wallet_engine.create_wallet_trx(function(result) { res.send(result) });
  • 您确定您正在使用的 API 接受这样的回调吗?这对于 Node 来说不是常规的,并且您显示的函数不处理任何参数。

标签: node.js asynchronous promise return tron


【解决方案1】:

您做得很好,但是这里的许多调用都是异步的,这是您面临的问题。 您应该使用async await or then,就像我在下面所做的那样,它可能会对您有所帮助..

// app js


var app = require('express')()
var http = require('http').createServer(app)
var wallet_engine = require('./function')
app.get('/', function (req, res) {
    result = wallet_engine.create_wallet_trx().then(data=>{
      res.json(data);
    }).catch(err=>{
      console.log(err);
    })
})
//////server listen
http.listen(8443, function () {
    console.log('listening on *:8443')
})



// function.js

var { HdTronPayments } = require('@faast/tron-payments')

module.exports = {
  create_wallet_trx: async function () {
      var keys = await HdTronPayments.generateNewKeys()
      var tronPayments = await new HdTronPayments({ hdKey: keys.xprv })
      var address = await tronPayments.getPayport(356)
      var privateKey = await tronPayments.getPrivateKey(356)
      var trx_wallet = { privateKey: privateKey, address: address }
      return trx_wallet
  }
}

结果:{"privateKey":"92ACAECFE00E9F90E330A6B031F10365F29AFDD503922CC99CA8704F1BA53432","address":{"address":"TGfsHx4VU6B36AwUy8Bqt6edoNnUHpMtSQ"}}

【讨论】:

  • 感谢 Atul 完成了这项工作。
  • 似乎不太可能需要所有四个等待。尝试省略前两个离开 var address = await tronPayments.getPayport(356)var privateKey = await tronPayments.getPrivateKey(356)
猜你喜欢
  • 2019-07-09
  • 2021-08-15
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2017-05-16
相关资源
最近更新 更多