【问题标题】:Lambda function – GET doesn't return anythingLambda 函数 – GET 不返回任何内容
【发布时间】:2020-01-10 02:08:58
【问题描述】:

我对无服务器框架和 AWS lambda 完全陌生。

当向http://localhost:3000/user/1e89a3f0-d170-11e9-94bd-91e9ae84f3e9 发出 GET 请求时,我希望将响应发送回浏览器,其中包含与密钥匹配的有效 JSON 对象。就像唯一注销到控制台一样。而不是空文档。

我返回不正确吗?我在调试这个时遇到了困难,如果问题出在我的 lambda 函数或者它是什么,我现在不会。

谢谢。

console.log声明

{
  email: 'i@am.com',
  password: '$argon2i$v=19$m=4096,t=3,p=1$IIICgcMqbUA7wFpEMqb/GA$ENScjko+Y8pruQsTiE6qN81QAJfAPX/T116RQZqe347Y1p0rez4KhKaEulMeabKKiu8',
  id: '1e89a3f0-d170-11e9-94bd-91e9ae84f3e9'
}

这是有问题的获取处理程序。

users/get.js

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

const dynamoDb = new AWS.DynamoDB.DocumentClient({
  region: "localhost",
  endpoint: "http://localhost:8000"
});

module.exports.get = async event => {
  const params = {
    TableName: process.env.DYNAMODB_TABLE,
    Key: {
      id: event.pathParameters.id
    }
  };

  dynamoDb.get(params, (error, result) => {
    if (error) {
      console.error(error);
      return;
    }
    console.log(result.Item); // logs successfully to the console.
    return {
      // doesn't return a response.
      statusCode: 200,
      body: JSON.stringify(result.Item)
    };
  });
};

serverless.yml

# EXCERPT

functions:
  get:
    handler: users/get.get
    events:
      - http:
          method: get
          path: user/{id}
          cors: true

resources:
  Resources:
    UsersDynamoDbTable:
      Type: "AWS::DynamoDB::Table"
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.DYNAMODB_TABLE}

custom:
  dynamodb:
    stages:
      - dev
    start:
      port: 8000
      inMemory: true
      sharedDb: true
      noStart: true

【问题讨论】:

    标签: aws-lambda aws-sdk serverless-framework


    【解决方案1】:

    您应该使用回调参数来返回响应:

    module.exports.get = (event, context, callback) => {
      const params = {
        TableName: process.env.DYNAMODB_TABLE,
        Key: {
          id: event.pathParameters.id,
        },
      };
    
      dynamoDb.get(params, (error, result) => {
        if (error) {
          console.error(error);
          callback({
            statusCode: 500,
            body: 'Unable to get item',
          });
        }
        console.log(result.Item);
    
        callback(null, {
          statusCode: 200,
          body: JSON.stringify(result.Item),
        });
      });
    };
    

    或者使用承诺:

    module.exports.get = async event => {
      try {
        const params = {
          TableName: process.env.DYNAMODB_TABLE,
          Key: {
            id: event.pathParameters.id,
          },
        };
    
        const result = await dynamoDb.get(params).promise();
        console.log(result.Item);
        return {
          statusCode: 200,
          body: JSON.stringify(result.Item),
        };
      } catch (error) {
        console.error(error);
        return {
          statusCode: 500,
          body: 'Unable to get item',
        };
      }
    };
    
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2017-01-18
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多