node.js - 从 aws lambda 调用外部 API 并在 lambda 函数中将响应作为回调
问题描述
我正在尝试使用节点请求模块在 aws Lambda 函数中调用外部 API。到目前为止,我已成功调用 API 并在 lambda 执行中获取数据。我遇到的唯一问题是通过响应获取我的 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}
我想我以错误的方式调用回调。有什么建议可以解决这个问题..?
解决方案
问题是你混合了回调和异步/等待风格,这不会像你期望的那样工作。你在这里有几个选择
[不推荐]:做一个嵌套回调,并在第一个回调的响应,调用第二个请求等等。
[不推荐]:使用请求包的承诺版本,该版本被称为
request-promise
现在已被弃用。[不推荐]:将请求的回调样式转换为基于承诺的承诺。模块再次
request
被弃用。有关更多详细信息,请参见此处。[推荐]:使用一些现代的包,这些包支持开箱即用的 Promise 并且维护得当。喜欢
got
,axios
等等。你可以在这里看到列表。
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
样式调整选项,但您会有所了解。
推荐阅读
- zsh - 如何发送时间信息以在 zsh-theme 中运行?
- laravel - 为什么 Laravel 的actingAs 没有按预期工作?
- ios - 使用 viewDidAppear() 在 swift5 中关闭另一个 ViewController 后刷新 ViewController
- android - 在 ViewModel 中添加用例时未解析的引用 DaggerApplicationComponent
- python - 如何在 3d 中获得边界(一组点)的平均曲线(一组点)?
- css - 总是在最后一个位置订购弹性项目
- spring - 为什么spring会覆盖标头中的Content-Type?
- python - 如何只替换之后有一些字符的 \n
- sql - 使用 PIVOT 将行转换为列
- javascript - 如何在单独的页面中呈现反应组件?