谁能解释调用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类型
答案 0 :(得分:3)
我认为您混合了两个不同的客户端定义文件DynamoDB
和DynamoDB.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;是;
import { DynamoDB } from "@aws-sdk/client-dynamodb"; // ES6 import
import { DynamoDBDocument, PutCommandInput } from "@aws-sdk/lib-dynamodb"; // ES6 import