【问题标题】:How can I make my Hapi route wait for data before returning a value?如何让我的 Hapi 路由在返回值之前等待数据?
【发布时间】:2020-04-13 17:19:51
【问题描述】:

我正在使用 Hapi.js 并且有一个我想用来获取数据然后返回结果的路由。

我曾尝试使用 async/await,但我一定做错了,因为当我调用的函数最终将结果打印到控制台时,路由正在返回,而无需等待该函数返回值。

'use strict';

const Hapi = require('@hapi/hapi');
const HandyStorage = require('handy-storage');
var ethBalance ='';

// Connection to public blockchain via Infura.io
const Web3 = require("web3");
const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/cf44bc52af3743bcad5f0b66813f8740"));

// Initialize Handy Storage
const storage = new HandyStorage({
    beautify: true
});

//Get ETH address from Handy Storage
storage.connect('./preferences.json');
var walletAddress = storage.state.wallet;

// Get wallet balance
const getWalletBalance = async () => {

    web3.eth.getBalance(`${walletAddress}`, async function(err, result) {
        if (err) {
        console.log('There was an error: ' + err);
        return ({ error: 'The wallet balance call failed.' });
        } else {
            ethBalance = await web3.utils.fromWei(result, "ether");
            console.log("This should be first: The wallet balance via API call is " + ethBalance + " ETH.");
            return ethBalance; // I expect the walletbalance route to wait for this to be returned
        }
    });
};

// API Server
const init = async () => {

    // Connection settings
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Get wallet balance
    server.route({
        method: 'GET',
        path: '/walletbalance/',
        handler: async (request, h) => {
            let result = null;
            try {
                result = await getWalletBalance();
                console.log('This should be second, after the getWalletBalance function has printed to the console.'); // this prints first, so await isn't working as expected
                return ({ ethBalance: result });
            } catch (err) {
                console.log('Error in walletbalance route');
            }
        }
    });

    // 404 error handling
    server.route({
        method: '*',
        path: '/{any*}',
        handler: function (request, h) {

            return ({
                message: 'Error!'
            });
        }
    });

    await server.start();
    console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

init();

知道我在哪里出错了吗?这是我第一次使用 async/await。

ETA:我的控制台如下所示:

[nodemon] starting `node index.js`
Server running on http://localhost:3000
This should be second, after the getWalletBalance function has printed to the console.
This should be first: The wallet balance via API call is 4061.894069996147660079 ETH.

这是我使用钱包余额路由时返回的 JSON:

{}

【问题讨论】:

    标签: node.js async-await hapijs


    【解决方案1】:

    根据我得到的答案,我能够得到我想要的结果:

    'use strict';
    
    const Hapi = require('@hapi/hapi');
    const HandyStorage = require('handy-storage');
    var ethBalance ='';
    
    // Connection to public blockchain via Infura.io
    const Web3 = require("web3");
    const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/cf44bc52af3743bcad5f0b66813f8740"));
    
    // Initialize Handy Storage
    const storage = new HandyStorage({
        beautify: true
    });
    
    //Get ETH address from Handy Storage
    storage.connect('./preferences.json');
    var walletAddress = storage.state.wallet;
    
    // Get wallet balance
    async function getWalletBalance(){
        let ethBalance = await web3.eth.getBalance(`${walletAddress}`);
          if (ethBalance.err) { 
            console.log('error in the called function');
            } else {
            return ethBalance;
      }
    }
    
    // API Server
    const init = async () => {
    
        // Connection settings
        const server = Hapi.server({
            port: 3000,
            host: 'localhost'
        });
    
        // Get wallet balance
        server.route({
            method: 'GET',
            path: '/walletbalance/',
            handler: async (request, h) => {
                try {
                    const result = await getWalletBalance();
                    const ethBalanceInWei = web3.utils.fromWei(result, "ether");
                    return ({ balance: ethBalanceInWei });
                } catch (err) {
                    console.log('Error in walletbalance route');
                }
            }
        });
    
        // 404 error handling
        server.route({
            method: '*',
            path: '/{any*}',
            handler: function (request, h) {
    
                return ({
                    message: 'Error!'
                });
            }
        });
    
        await server.start();
        console.log('Server running on %s', server.info.uri);
    };
    
    process.on('unhandledRejection', (err) => {
        console.log(err);
        process.exit(1);
    });
    
    init();
    

    感谢您的帮助!这让我朝着正确的方向前进。

    【讨论】:

      【解决方案2】:

      基本上你的getWalletBalance 函数使用了多个概念。回调风格的函数和你正在使用的内部等待。我已经对您的代码进行了一些重组。希望这能解决您面临的问题。

      'use strict';
      
      const Hapi = require('@hapi/hapi');
      const HandyStorage = require('handy-storage');
      var ethBalance ='';
      
      // Connection to public blockchain via Infura.io
      const Web3 = require("web3");
      const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/cf44bc52af3743bcad5f0b66813f8740"));
      
      // Initialize Handy Storage
      const storage = new HandyStorage({
          beautify: true
      });
      
      //Get ETH address from Handy Storage
      storage.connect('./preferences.json');
      var walletAddress = storage.state.wallet;
      
      function getWalletBalance() {
        return Promise((resolve, reject) => {
          web3.eth.getBalance(`${walletAddress}`, (err, result) => {
            if (err) {
              console.log('There was an error: ' + err);
              reject({ error: 'The wallet balance call failed.' });
              } else {
                resolve(result);
              }
          });
        });
      }
      
      // API Server
      const init = async () => {
      
          // Connection settings
          const server = Hapi.server({
              port: 3000,
              host: 'localhost'
          });
      
          // Get wallet balance
          server.route({
              method: 'GET',
              path: '/walletbalance/',
              handler: async (request, h) => {
                  try {
                      const result = await getWalletBalance();
                      ethBalance = await web3.utils.fromWei(result, "ether");
                      return ethBalance;
                  } catch (err) {
                      console.log('Error in walletbalance route');
                  }
              }
          });
      
          // 404 error handling
          server.route({
              method: '*',
              path: '/{any*}',
              handler: function (request, h) {
      
                  return ({
                      message: 'Error!'
                  });
              }
          });
      
          await server.start();
          console.log('Server running on %s', server.info.uri);
      };
      
      process.on('unhandledRejection', (err) => {
          console.log(err);
          process.exit(1);
      });
      
      init();
      

      【讨论】:

      • 谢谢。这不起作用:[nodemon] starting node stack.js` Server running on http://localhost:3000 Error in walletbalance route Debug: internal, implementation, error Error: handler method did not return a value, a promise, or throw an error 但它让我知道要看什么 - 显然我的 Promise 语法全错了。
      • 如果不修改代码将无法工作,但很高兴它给了你一个想法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2010-10-19
      相关资源
      最近更新 更多