从 aws lambda 调用外部 API 并在 lambda 函数中获取响应作为回调

call external API from aws lambda and get respose as callback in lambda funtion

我正在尝试使用节点请求模块在 aws Lambda 函数中调用外部 API。到目前为止,我已成功调用 API 并在 lambda 执行中获取数据。我遇到的唯一问题是使用 response.even 获取我的 userInfo 数据 我的 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}  

我想我调用回调的方式不对。有什么解决这个问题的建议吗..?

问题是您混淆了回调和 async/await 样式,这不会像您期望的那样工作。您在这里有几个选择

  • [不推荐]: 做一个嵌套的回调,在第一个回调的响应上,调用第二个请求等等。

  • [不推荐]:使用名为 request-promise 的请求包的 promise 版本,因为它现在已被弃用。

  • [不推荐]:将请求的回调样式转换为基于承诺的回调方式。 request 模块再次被弃用。有关详细信息,请参阅 here

  • [推荐]:使用一些支持开箱即用并得到适当维护的现代软件包。比如gotaxios等。可以看到列表here.

如果您使用 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 样式调整选项,但您会明白的。