Как получить тело ответа по HTTP-запросу POST через библиотечный запрос - PullRequest
0 голосов
/ 13 января 2020

Я делаю HTTP POST-запрос через библиотечный запрос, но не могу получить ТЕЛО ответа

В журнале консоли я вижу правильный ответ, но функция getBlock rerun 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 ]

1 голос
/ 14 января 2020

await this.request() не работает, потому что request() не возвращает обещание, поэтому await не делает ничего полезного.

Вместо этого используйте модуль request-promise и избавьтесь от обратного вызова.

Или, поскольку request() находится в режиме обслуживания и больше не получает новые функции, переключитесь на модуль 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;
}

EDIT январь 2020 г. - модуль request () в режиме обслуживания

К вашему сведению, модуль request и его производные, такие как request-promise, теперь находятся в режиме обслуживания и не будут активно развиваться, чтобы добавлять новые функции. Вы можете прочитать больше о рассуждениях здесь . В этой таблице приведен список альтернатив с некоторым обсуждением каждого из них. Я сам использовал got(), и он с самого начала создан для использования обещаний и прост в использовании.

0 голосов
/ 13 января 2020

Проблема в вашем request звонке. Это стиль обратного вызова. Это означает, что возвращаемый blockcount будет выполнен первым, а blockcount = body.result; будет выполнен после завершения асинхронного вызова. Здесь у вас есть две альтернативы

  • Либо преобразуйте стиль обратного вызова в обещание, и получите результаты в переменной.
  • ИЛИ верните ответ внутри своего обратного вызова.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...