首页 > 解决方案 > Lambda 总是返回 200

问题描述

当我为我的 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);
    });
};

标签: node.jsaws-lambdaamazon-dynamodb

解决方案


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

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

这是我们可以做的:根据响应返回错误,无论是 200 还是 400!

检查Lodash的resdone function isEmpty 方法并使用您的.

'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);
    });
};

希望这能解决您的疑问!


推荐阅读