【问题标题】:Lambda always returns 200Lambda 总是返回 200
【发布时间】:2018-07-29 19:18:33
【问题描述】:

当我为我的 Lambda 函数提供用于 GetItem 调用的无效主键时,它似乎会搜索该键直到超时,但它仍然只返回 200(没有响应正文)。

有什么方法可以确保函数在遍历表一次后中止而不找到键并返回错误消息?让它一遍又一遍地查看直到超时似乎是在浪费功能时间?此外,它在 1000 毫秒后超时,这不是我的函数超时设置,这让我认为这里除了常规超时之外还有其他事情发生。

代码:

'use strict';

const AWS = require('aws-sdk');

const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {

  const done = (err, res) => {

    const response = {
      statusCode: err ? '400' : '200',
      body: err ? JSON.stringify(err) : JSON.stringify(res)
    }

    callback(null, response);

  };

  const groupId = event.pathParameters.groupId;
  const eventId = event.pathParameters.eventId;

  docClient.get({
      TableName: 'events',
      Key: {
        groupId,
        eventId
      }
   },
    (err, data) => {
      done(err, data.Item);
    });
};

【问题讨论】:

  • 你能告诉你在docClient.get的回调中得到了什么吗??
  • console.log(err, data) 给出 err: null, data: {}
  • 使用这个,我可以应用一些条件逻辑来检查它是否返回一个空对象等,但我真的宁愿中止并让它返回一个错误
  • 好吧,你是说,它应该返回错误而不是空对象?
  • 在一个完美的世界中,我希望函数在它“意识到”我提供了不正确的主键后停止,然后返回一些错误,告诉客户端它找不到表中具有该主键的项目,是的!

标签: node.js aws-lambda amazon-dynamodb


【解决方案1】:

在一个完美的世界中,我希望函数在“意识到”我提供了不正确的主键后停止,然后返回一些错误,告诉客户端它在表中找不到项目用那个主键,是的!

这只有在我们让数据库操作完成时才会发生!所以我们必须依赖数据库的响应。

我们可以这样做:基于响应返回错误,无论是 200 还是 400!

检查 Lodash 的 res isEmpty 方法是否并使用您的 done function 返回 400。

'use strict';

const AWS = require('aws-sdk');

const docClient = new AWS.DynamoDB.DocumentClient();

const { isEmpty }  = require('lodash');

exports.handler = (event, context, callback) => {

  const done = (err, res) => {

    const response = {
      statusCode: (err || isEmpty(res)) ? '400' : '200',
      body: err ? JSON.stringify(err) : JSON.stringify(res)
    }

    callback(null, response);

  };

  const groupId = event.pathParameters.groupId;
  const eventId = event.pathParameters.eventId;

  docClient.get({
      TableName: 'events',
      Key: {
        groupId,
        eventId
      }
   },
    (err, data) => {
      done(err, data.Item);
    });
};

希望这能解决您的问题!

【讨论】:

  • 谢谢,杰克!这不完全是我所希望的,但它现在可以工作了:) 至少在我找到更好的解决方案之前会这样做!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2015-03-16
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多