ProjectionExpression causes 'Unsupported type passed' error when querying

0

Hello,

I seem to be having a strange issue when querying on my GSI that as soon as I specify the fields I wish to return in the query, I get the "Unsupported type passed" error.

Here's the query:

{
  TableName: 'RatingsTable',
  IndexName: 'username',
  KeyConditionExpression: '#username = :username',
  ExpressionAttributeNames: { '#username': 'username' },
  ExpressionAttributeValues: { ':username': { S: 'jonathanmsifleet' } },
  ProjectionExpression: 'username, imdb_title_id'
}

The table:

RatingsTable:
  Type: AWS::DynamoDB::Table
  Properties:
    TableName: RatingsTable
    BillingMode: PAY_PER_REQUEST
    AttributeDefinitions:
      - AttributeName: imdb_title_id
        AttributeType: N
      - AttributeName: username
        AttributeType: S

    KeySchema:
      - AttributeName: imdb_title_id
        KeyType: HASH
      - AttributeName: username
        KeyType: RANGE

    GlobalSecondaryIndexes:
      - IndexName: username
        KeySchema:
          - AttributeName: username
            KeyType: HASH
        Projection:
          ProjectionType: ALL

The strange thing is that if I remove ProjectionExpression from the query it executes fine, yet as soon as I specify fields then it throws the error. The error in its entirety in Cloudwatch is Unsupported type passed: username, if I remove username then it moves to the next field, Unsupported type passed: imdb_title_id.

Here's the code I am using to run the query:

    query = {
      TableName: 'RatingsTable',
      IndexName: 'username',
      KeyConditionExpression: '#username = :username',
      ExpressionAttributeNames: {
        '#username': 'username'
      },
      ExpressionAttributeValues: {
        ':username': { S: username }
      },
      ProjectionExpression: 'username, imdb_title_id'
    };
    console.log('query', query);

    const result = await dbClient.send(new QueryCommand(query));

Any ideas what I am doing wrong?

asked 8 months ago237 views
1 Answer
1

I would start by ensuring you are on the latest AWS SDK version for node V3. It works for me on v3.44.0 with no issue, only thing I needed to change was your ExpressionAttributeValues as V3 takes native string and no DDB JSON.

    query = {
      TableName: 'RatingsTable',
      IndexName: 'username',
      KeyConditionExpression: '#username = :username',
      ExpressionAttributeNames: {
        '#username': 'username'
      },
      ExpressionAttributeValues: {
        ':username':  username
      },
      ProjectionExpression: 'username, imdb_title_id'
    };
    console.log('query', query);

    const result = await dbClient.send(new QueryCommand(query));
profile picture
answered 8 months ago
  • Without specifying the Data type for ExpressionAttributeValues, TypeScript throws this error: Type 'string' is not assignable to type 'AttributeValue' and CloudWatch gives this error, Cannot read property '0' of undefined. I'll try downgrading to 3.44 as I'm using 3.54.1

    Edit: Downgrading and Specifying Data type solved this!

You are not logged in. Log in to post an answer.

A good answer clearly answers the question and provides constructive feedback and encourages professional growth in the question asker.

Guidelines for Answering Questions