我通过库请求发出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
答案 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;
。您在这里有两种选择