вызовите внешний API из aws лямбда и получите respos как обратный вызов в функции лямбда - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь вызвать внешний API внутри aws Лямбда-функции, используя модуль запроса узла. пока я успешно вызываю API и получаю данные в ходе лямбда-выполнения. Единственная проблема, с которой я сталкиваюсь, - это получение моих данных userInfo с помощью response.even. У моего userInfo есть данные в разделе «Предоставление мне пустого объекта на стороне клиента»

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var request = require('request');
const encode = require('nodejs-base64-encode');
var lambda = new AWS.Lambda();
import { Handler, Context, Callback } from "aws-lambda";
import { PayPalLinkDetails } from "../../View/PayPalLinkDetails";
import { PayPalLinkResponse, PayPalLinkResponseBody } from "../../View/PayPalLinkResponseBody";

const PAYPAL_CLIENT = process.env.PayPalClientID;
const PAYPAL_SECRET = process.env.PayPalSecretKEY;
const PAYPAL_OAUTH_API = process.env.PayPalAuthAPI;
const PAYPAL_IDENTITY_API = process.env.PayPalIdentityAPI;

const LinkPayPal: Handler = async (paypalRequest : PayPalLinkDetails, context: Context, callback: Callback) => {

    var userInfo = new PayPalLinkResponse();     
    var paypalresponse = new PayPalLinkResponseBody();
    const basicAuth = encode.encode(PAYPAL_CLIENT+":"+PAYPAL_SECRET, 'base64');      
      var options = {
        'method': 'POST',
        'url': PAYPAL_OAUTH_API,
        'headers': {
          'Authorization': 'Basic '+basicAuth,
          'Content-Type': 'application/x-www-form-urlencoded'
        },
        form: {
          'grant_type': 'authorization_code',
          'code': paypalRequest.code
        }
      };

      await request(options, async function (error : any, response :any) { 
        if (error)
        {
           console.log(error);
        }
        else
        {
            paypalresponse = response.body;
           // save data to DB here
        }

      });

      var getIdentity = {'method': 'get','url': PAYPAL_IDENTITY_API,'headers': {'Authorization': 'Basic '+basicAuth,'Content-Type': 'application/x-www-form-urlencoded'},form: {'grant_type': 'authorization_code','code': paypalresponse.access_token}};

       await request(getIdentity, function (err : any, res :any)
                                {
                                    if (err)
                                    {
                                        console.log(err);
                                    }
                                    else
                                    {        
                                        userInfo = res.body; // this Print the values as expected
                                        console.log(userInfo);

                                    }
                                });


 callback(null,userInfo); // This Giving me Empty value      
}

export {LinkPayPal}  

Я думаю, что я вызываю обратный вызов неправильно. Есть ли какие-либо предложения для решения этой проблемы ..?

1 Ответ

1 голос
/ 29 февраля 2020

Проблема в том, что вы смешали функции обратного вызова и асинхронного ожидания, которые не будут работать так, как вы ожидаете. У вас есть несколько вариантов здесь

  • [Не рекомендуется] : выполнить вложенный обратный вызов и при ответе на первый обратный вызов, вызвать второй запрос и т. Д.

  • [Не рекомендуется] : используйте версию обещания пакета запроса, который называется request-promise, так как в настоящее время это исключается.

  • [Не рекомендуется] : преобразование стиля обратного вызова запроса в обещание, основанное на заключении в обещание. Снова request модуль является устаревшим. См. здесь для получения более подробной информации.

  • [Рекомендуется] : Используйте некоторые современные дневные пакеты, которые поддерживают обещания из коробки и поддерживаются должным образом. Как got, axios et c. Вы можете увидеть список здесь .

Вот как будет выглядеть код, если вы используете, скажем, got pacakge для выполнения http-вызовов.

var AWS = require("aws-sdk");
AWS.config.region = "us-east-1";
var got = require("got");
const encode = require("nodejs-base64-encode");
var lambda = new AWS.Lambda();
import { Handler, Context, Callback } from "aws-lambda";
import { PayPalLinkDetails } from "../../View/PayPalLinkDetails";
import {
  PayPalLinkResponse,
  PayPalLinkResponseBody
} from "../../View/PayPalLinkResponseBody";

const PAYPAL_CLIENT = process.env.PayPalClientID;
const PAYPAL_SECRET = process.env.PayPalSecretKEY;
const PAYPAL_OAUTH_API = process.env.PayPalAuthAPI;
const PAYPAL_IDENTITY_API = process.env.PayPalIdentityAPI;

const LinkPayPal: Handler = async (
  paypalRequest: PayPalLinkDetails,
  context: Context,
  callback: Callback
) => {
  var userInfo = new PayPalLinkResponse();
  var paypalresponse = new PayPalLinkResponseBody();
  const basicAuth = encode.encode(
    PAYPAL_CLIENT + ":" + PAYPAL_SECRET,
    "base64"
  );
  var options = {
    method: "POST",
    url: PAYPAL_OAUTH_API,
    headers: {
      Authorization: "Basic " + basicAuth,
      "Content-Type": "application/x-www-form-urlencoded"
    },
    form: {
      grant_type: "authorization_code",
      code: paypalRequest.code
    }
  };

  const paypalresponse = await got(options);

  var getIdentity = {
    method: "get",
    url: PAYPAL_IDENTITY_API,
    headers: {
      Authorization: "Basic " + basicAuth,
      "Content-Type": "application/x-www-form-urlencoded"
    },
    form: {
      grant_type: "authorization_code",
      code: paypalresponse.access_token
    }
  };

  const userInfo = await got(getIdentity);

  return userInfo;
};

export { LinkPayPal };

Возможно, вам придется настроить параметры в соответствии со стилем got, но вы получите представление.

...