【问题标题】:AWS Unhandled exception lambda function returns: Internal Server ErrorAWS 未处理的异常 lambda 函数返回:内部服务器错误
【发布时间】:2021-01-13 12:31:49
【问题描述】:

在 Cloudwatch 上,我遇到一条错误消息:

HTTP/1.1" 500 35 ZHTFXgWBoAYEQ4a= The Lambda function returned the following error: "Unhandled". Check your Lambda function code and try again.

我正在尝试使用简单的 lambda 函数构建新的 HTTP API 网关。

这是我的 lambda 函数:

const AWS = require("aws-sdk");
const dynamodb = new AWS.DynamoDB({
  region: "us-east-1",
  apiVersion: "2012-08-10"
});

exports.handler = (event, context, callback) => {
  const params = {
    Key: {
      id: {
        S: event.id
      }
    },
    TableName: "todos"
  };
  dynamodb.getItem(params, (err, data) => {
    if (err) {
      console.log(err);
      callback(err);
    } else {
      callback(null, {
        id: data.Item.id.S,
        title: data.Item.title.S,
        watchHref: data.Item.watchHref.S,
        authorId: data.Item.authorId.S,
        length: data.Item.length.S,
        category: data.Item.category.S
      });
    }
  });
};

数据的结构如下:

这就是我调用它的方式以及我得到的 JSON 响应:

我做错了什么?

编辑: 这是更详细的日志:

"ValidationException: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes",

但我是否给了它正确的值?

【问题讨论】:

  • 如果您查看 lambda 日志(在 AWS GUI 的函数视图上应该有指向您的 lambda 的 cloudwatch 日志的链接),那里应该有更多有用的信息。
  • @ZacAnger 谢谢,我去那里粘贴了新日志。这就像它没有找到价值?它说空

标签: amazon-web-services aws-lambda


【解决方案1】:

您找到的详细错误日志指向验证错误。这意味着在您对 Dynamo 的请求中,您使用的对象 (params) 无效。根据the docs,该形状看起来是正确的,因此它必须意味着您的event.id 是一个空字符串或当它到达您的函数时为空。您从 Postman 发送 ID 作为查询参数,是否将其映射到其他地方?如果不是,您将希望使用event.queryStringParameters.id 和代理集成,如here 所述。

【讨论】:

  • 感谢您的提示,我在 event.id 上放了一个记录器,它是 undefined,为什么它没有从数据库中获取 id ?
  • 我将 id 行更改为 event.queryStringParameters.id 并且成功了!你能解释一下发生了什么吗?
  • event 是来自调用者(本例中为 API 网关)的任何信息。 Lambda 代理集成发送最初命中 API 网关的整个请求,这就是为什么需要启用它以获取查询参数。上面的文档是here。恕我直言,它应该是默认设置:)
  • 我仍然有你所说的关于激活代理集成的问题,我以为我确实激活了它。所以如果我必须使用event.queryStringParameters.id 而不是event 那意味着我没有激活它?
  • 不,这意味着你知道。如果您没有激活它,event.queryStringParameters 将是未定义的。无论哪种方式,id 都不会出现在 event 对象上,因为它不是请求正文的一部分,而且您不是 lambda 的 invoking,API Gateway 是。
【解决方案2】:

Lambda 响应应该是特定的format,以便 API 网关能够正确识别和响应

  • Actual Api Response 应转换为 String 并传递给 body。

  • 带有 statusCode、body、headers、isBase64Encoded 的整个 JSON 应该作为来自 Lambda 的响应传递。

  • 为了成功callback(null, responseObject)

  • 对于失败callback(responseObject)
    这里是一个 responseObject 的例子:

     {
      "statusCode": 200,
      "body": "{\"id\":\"1\",\"title\":\"My Title\"}",
      "isBase64Encoded": false,
      "headers": {
          "Content-Type": "application/json"
      }
    }
    

【讨论】:

  • 嗨,我正在学习 Lambda 函数,该响应在我的代码中的什么位置?
  • 响应应该是整个 JSON,应该发送到回调方法,更新的答案包含更多细节。
  • 如果我的 lamda 函数错误,为什么在 lambda 的测试区域如果我提供与我发布的相同的 json,我会得到响应?
  • 您的 Lambda 是正确的并且正在返回响应。它只是不是 API Gateway 理解的响应。
  • 哦,我明白了,那么我如何将 api 理解它放在我的代码上?
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2017-06-29
  • 2019-12-21
  • 1970-01-01
相关资源
最近更新 更多