Возврат ответов от got (запросов) к объекту для обратного вызова - PullRequest
0 голосов
/ 13 марта 2020

Я использую модуль got для выполнения запросов POST для получения данных. Я хочу синхронно вызвать 3 API, получить объекты ответа, затем обратный вызов. У меня возникли проблемы при получении ответа на объект обратного вызова. Он возвращает {} вместо фактического ответа. Я также хотел бы сделать все эти вызовы синхронно, чтобы запросы происходили одновременно, чтобы сэкономить время.

const got = require('got');

exports.handler = (event, context, callback) => {
    
    async function getDATA1() {
    	return await got.post('https://url.com/serviceapi/1/', {
    	    responseType: 'json',
            resolveBodyOnly: true,
            username: 'user',
            password: 'pass',
    		json: {
                "Input": {
                    "item":1,
                }
            }
    	}).json();
    }

    async function getDATA2() {
    	return await got.post('https://url.com/serviceapi/2/', {
    	    responseType: 'json',
            resolveBodyOnly: true,
            username: 'user',
            password: 'pass',
    		json: {
                "Input": {
                    "item":2,
                    "color":"blue",
                }
            }
    	}).json();
    }

    async function getDATA3() {
    	return await got.post('https://url.com/serviceapi/3/', {
    	    responseType: 'json',
            resolveBodyOnly: true,
            username: 'user',
            password: 'pass',
    		json: {
                "Input": {
                    "item":3,
                    "size":"large",
                }
            }
    	}).json();
    }
    
    callback(null,{
        "DATA1": getDATA1(),
        "DATA2": getDATA2(),
        "DATA3": getDATA3(),
    });
};

Ответ, который я получаю,

{
  "DATA1": {},
  "DATA2": {},
  "DATA3": {}
}

Ответ, который я ожидаю / хочу, выглядит примерно так

{
  "DATA1": {
               "available_f":"Y"
           },
  "DATA2": {
               "available_f":"N"
           },
  "DATA3": {
               "available_f":"Y"
           },
}

1 Ответ

1 голос
/ 13 марта 2020

Эти асин c функции нужно будет ждать, поэтому вам нужно будет сделать что-то вроде этого, которое будет ждать, пока все запросы не будут решены, а затем вы сможете собрать результаты и вернуть их через обратный вызов.

const got = require('got');

exports.handler = (event, context, callback) => {

    async function getDATA1() {
        return await got.post('https://url.com/serviceapi/1/', {
            responseType: 'json',
            resolveBodyOnly: true,
            username: 'user',
            password: 'pass',
            json: {
                "Input": {
                    "item": 1,
                }
            }
        }).json();
    }

    async function getDATA2() {
        return await got.post('https://url.com/serviceapi/2/', {
            responseType: 'json',
            resolveBodyOnly: true,
            username: 'user',
            password: 'pass',
            json: {
                "Input": {
                    "item": 2,
                    "color": "blue",
                }
            }
        }).json();
    }

    async function getDATA3() {
        return await got.post('https://url.com/serviceapi/3/', {
            responseType: 'json',
            resolveBodyOnly: true,
            username: 'user',
            password: 'pass',
            json: {
                "Input": {
                    "item": 3,
                    "size": "large",
                }
            }
        }).json();
    }

    Promise.all([getDATA1, getDATA2, getDATA3]).then(values => {
        return callback(null, {
            DATA1: values[0],
            DATA2: values[1],
            DATA3: values[2]
        })
    }).catch(err => {
        return callback(err);
    });
};
...