dynamodb获取项目打字稿地狱

时间:2019-03-14 16:11:18

标签: amazon-web-services aws-lambda amazon-dynamodb aws-sdk aws-sdk-js

谁能解释调用DocumentClient.get时如何使用GetItemInput类型,如果我传入任何类型的对象都可以工作,但是如果我尝试强烈键入params对象,则会得到错误

ValidationException:提供的键元素与架构不匹配

这是我的lambda函数代码,在其中我以 any ...

类型传递参数
export const get: Handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {

  console.log(event.pathParameters)
  if (!event.pathParameters) {
    throw Error("no path params")
  }

  const params: any = {
    Key: {
      id: event.pathParameters.id
    },
    TableName: table
  }

  console.log(params)
  try {
    const result: any = await dynamoDb.get(params).promise()
    return {
      body: JSON.stringify(result.Item),
      statusCode: result.$response.httpResponse.statusCode
    }

  } catch (error) {
    console.log(error)
    return {
      body: JSON.stringify({
        message: `Failed to get project with id: ${event.pathParameters!.id}`
      }),
      statusCode: 500
    }
  }
}

这是我尝试使其与 GetItemInput

类型一起使用
export const get: Handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {

  console.log(event.pathParameters)
  if (!event.pathParameters) {
    throw Error("no path params")
  }

  const params: GetItemInput = {
    Key: {
      "id": { S: event.pathParameters.id }
    },
    TableName: table
  }

  console.log(params)
  try {
    const result: any = await dynamoDb.get(params).promise()
    return {
      body: JSON.stringify(result.Item),
      statusCode: result.$response.httpResponse.statusCode
    }

  } catch (error) {
    console.log(error)
    return {
      body: JSON.stringify({
        message: `Failed to get project with id: ${event.pathParameters!.id}`
      }),
      statusCode: 500
    }
  }
}

如果我像以前一样离开钥匙...

 const params: GetItemInput = {
    Key: {
      id: event.pathParameters.id
    },
    TableName: table
  }

不出所料,我收到类型错误。但是不能理解我如何形成我的密钥,这样我就不能对ValidationException进行密钥化。 DynamoDb中的id字段不是String类型

2 个答案:

答案 0 :(得分:3)

我认为您混合了两个不同的客户端定义文件DynamoDBDynamoDB.DocumentClient。使用DynamoDB.DocumentClient客户端时,同时使用DynamoDB.Types.GetItemInput中的界面DynamoDB

您应该使用DynamoDB.DocumentClient.GetItemInput

import {DynamoDB} from 'aws-sdk';
const dynamo = new DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

...
const params: DynamoDB.DocumentClient.GetItemInput = {
    TableName: table,
    Key: {
        id: event.pathParameters.id
    }
};
const result = await this.dynamo.get(params).promise();

答案 1 :(得分:0)

@ttulka 的回答是完美的,但补充一下,我遇到了同样的问题,花 5 分钟时间消除了现在从官方 AWS JS SDK 访问 DynamoDB 的多种不同方式的歧义确实很有帮助。

5分钟就是我的答案,看完之后你就明白了;

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_lib_dynamodb.html

tldr;是;

  • 知道您使用的是哪个 AWS JS 版本,是 v2 还是 v3,并在您从 Internet 中提取其他可能适用于旧版本的示例时注意 - 您应该能够根据导入进行判断您正在使用,以下是 v3 导入的样子:

import { DynamoDB } from "@aws-sdk/client-dynamodb"; // ES6 import
import { DynamoDBDocument, PutCommandInput } from "@aws-sdk/lib-dynamodb"; // ES6 import

  • 您可能希望使用 DocumentClient 而不是原始 DynamoDB,您需要在其中指定所有属性的原始类型 - 为了成功执行此操作,您的 DynamoDB JS 对象必须以正确的方式构建(并且上面的文档解释了究竟如何)
  • 了解您使用的是 DynamoDB 的“裸机”还是“完整版”,因为如果您使用完整版,您将可以访问 TS 中的更多类型/提示
  • 并且您可能想要使用 client-dynamodb 和 lib-dynanmodb,因为后者是 SDK 的附加功能,可帮助简化操作(确实如此)