【问题标题】:Rest-API call fails in lambda functionlambda 函数中的 Rest-API 调用失败
【发布时间】:2020-10-25 20:06:02
【问题描述】:

我是 AWS 中的 lambda 函数的新手,我需要一些建议来弄清楚问题的本质。 AWS Lambda 函数基于使用 node.js 12.x 的 Javascript。 我确实在 Ubuntu 18.04 和 MacOs Catalina 上设置了基于 SAM (sam cli/aws cli/docker/IntelliJ) 的本地开发环境,并在两个系统上都运行了一个简单的基本 lambda 函数。 我可以设置日志并在 docker 运行时通过 IntelliJ 查看它们。 该函数是使用终端中的 sam init 命令并选择一个简单的 hello world 创建的。

我确实在其中添加了一个 Rest-API 调用。 没什么特别的,使用 request 2.88.2(我知道它已被弃用,我确实尝试使用其他方式,但它们都失败了,所以我现在坚持使用 request)。

基本上,对 API 的调用“似乎”根本没​​有发生。 显示在 API 调用之前和之后放置的日志。 API 调用中的日志(例如显示错误或结果)永远不会出现。 到目前为止,只有在一种情况下,当我删除 URI 时,我能够看到来自 API 的错误消息。 正如预期的那样,API 返回了一条错误消息:无效的 URI。

否则什么都没有。这里有一些代码。 该函数从 lambda 处理程序中调用。

function getToken() {
    const request = require('request');
    const qs = require('querystring');

    console.log("getToken function called");

    let bodyData = qs.stringify({
        username: 'test',
        password: 'xxxxx',
        grant_type: 'password'
    });

    console.log("getToken bodyData : " + bodyData);

    let options = {
        url: "https://blahblahblah/function",
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
        },
        form: bodyData
    };

    console.log("getToken options : " + options);

    var request1 = request(options, function(err, response, body) {
        console.log("returned from API call");

        if (err) {
            console.log("Error from getToken : " + err);
            return null;
        } else {
            console.log("Answer from getToken : " + body);
            return body;
        }
    });
}

我确实使用 Postman 测试了连接和 API,并且正在工作。 请求中的所有日志都不会出现。 无论更改选项(确实尝试了许多不同的方式)。 我究竟做错了什么 ? 有关如何跟踪此问题的任何建议?

谢谢

史蒂夫

【问题讨论】:

  • 您是否为“callbackWaitsForEmptyEventLoop”设置了值?如果设置为 false,则 lambda 将返回,并且可能不会执行任何剩余的异步调用
  • 不,我没有。寻找那个。谢谢!

标签: amazon-web-services rest aws-lambda http-post


【解决方案1】:

这是正确的行为。因为函数getToken没有等待http请求完成。您应该将函数转换为使用 promise/async-await 或简单地回调。

承诺

async function getToken() {
  ...
  return new Promise((resolve, reject) => {
    request(options, function (err, response, body) {
      console.log("returned from API call");

      if (err) {
        console.log("Error from getToken : " + err);
        resolve(null);
      } else {
        console.log("Answer from getToken : " + body);
        resolve(body);
      }
    });
  });
}

// Then in the lambda Handler:
// await getToken()

回调

function getToken(callback) {
  ...
  
  request(options, function (err, response, body) {
    console.log("returned from API call");

    if (err) {
      console.log("Error from getToken : " + err);
      callback(null);
    } else {
      console.log("Answer from getToken : " + body);
      callback(body);
    }
  });
}

// Then in the lambda
getToken(() => {
  // handle the http request response
})

【讨论】:

  • 我明白了,谢谢!我在怀疑类似的事情,即需要一些承诺或回调,但我没有在网上找到明确的信息......太多的东西,通常是旧的或收缩的。我会尝试应用你的建议!谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2023-02-08
  • 2023-01-02
  • 2021-07-29
相关资源
最近更新 更多