DynamodB получить элемент машинописного ада - PullRequest
0 голосов
/ 14 марта 2019

Может кто-нибудь объяснить, как использовать тип GetItemInput при вызове DocumentClient.get, если я передаю объект любого типа, get works, но если я пытаюсь и строго набираю объект params, я получаю ошибку

ValidationException: предоставленный ключевой элемент не соответствует схеме

Вот мой код лямбда-функции, где я передаю параметры в виде 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. Не поле id имеет тип String в DynamoDb

1 Ответ

3 голосов
/ 14 марта 2019

Я думаю, вы смешиваете два разных файла определения клиента 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();
...