Lambda 函数 – GET 没有 return 任何东西

Lambda function – GET doesn't return anything

我对无服务器框架和 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'
}

这是有问题的 get 处理程序。

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

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

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