如何通过库请求通过HTTP POST请求获取响应主体

时间:2020-01-13 14:37:40

标签: javascript node.js request

我通过库请求发出HTTP POST请求,但无法获得响应的身体

在控制台日志中,我看到了正确的答案,但函数getBlock重新运行了0

class BlockExplorer {
    private readonly request = require("request");
    private readonly options = {
        method: 'POST',
        url: 'https://example.com',
        headers:
        {
            Host: 'example.com'',
            Authorization: 'Basic basicBasicBasic=',
            'Content-Type': 'application/json'
        },
        json: true
    };

    async init() {
        const blockNum: Number = await this.getBlock();
        console.log(`Block num: ${blockNum}`);
    }

    private async getBlock() {
        let blockcount: Number = 0;
        var options = {
            body: { jsonrpc: '2.0', method: 'getblockcount', params: [] },
            ...this.options
        };

        await this.request(options, function (error, response, body) {
            if (error) throw new Error(error);
            console.log(body.result);
            blockcount = body.result;
        });

        return blockcount;
    }
}

new BlockExplorer().init();

我的控制台日志:

Block num: 0
617635

2 个答案:

答案 0 :(得分:1)

等待this.request()不起作用,因为request()不返回承诺,因此await没什么用。

相反,请使用request-promise模块并摆脱回调。

或者,由于request()处于维护模式并且不再获得新功能,请切换到已经可以使用promises的got()模块。

const rp = require('request-promise');

private async getBlock() {
    let blockcount: Number = 0;
    var options = {
        body: { jsonrpc: '2.0', method: 'getblockcount', params: [] },
        ...this.options
    };

    let body = await rp(options);
    console.log(body.result);
    blockcount = body.result;

    return blockcount;
}

编辑2020年1月-维护模式下的request()模块

FYI,request模块及其派生工具(如request-promise)现在处于维护模式,不会积极开发以添加新功能。您可以阅读有关推理here的更多信息。 this table中列出了替代方案,并对每个替代方案进行了一些讨论。我本人一直在使用got(),它是从一开始就使用诺言而构建的,并且易于使用。

答案 1 :(得分:0)

问题是您的request通话。这是回调样式。这意味着返回块计数将首先执行,而asyn调用完成后将执行blockcount = body.result;。您在这里有两种选择

  • 将回调样式转换为promise并将结果保存在变量中。
  • 或在回调中返回响应。