DynamoDB 结果的结构不是我想要的

DynamoDB result is not structured the way I want

我正在执行一个简单的命令来列出我 table 中的所有项目。但是,我取回的数据并不是按照我想要的方式构建的。我想要一个简单的 JSON 结构,但 DynamoDB 正在将结果转换为嵌套对象。

DynamoDB 给我以下回复:

// What I am currently getting
[
  {
    id: { S: '8' },
    lastName: { S: 'Perry' },
    firstName: { S: 'Matthew' }
  },
  {
    id: { S: '3' },
    firstName: { S: 'Joan' },
    lastName: { S: 'Peter' }
  }
]

但我想要这个:

// What I want
[
  {
    id: 8
    lastName:  'Perry' ,
    firstName: 'Matthew' 
  },
  {
    id: 3,
    firstName: 'Joan' ,
    lastName:  'Peter' 
  }
]

如何实现后面的结果集。下面是我的代码:

const { ExecuteStatementCommand } = require('@aws-sdk/client-dynamodb') 
const { ddbDocClient, memberTableName } = require('./client.js')

const selectAll = async () => {
    const params = {
        Statement: `SELECT * FROM ${memberTableName}`,
        Parameters: [{ S: '3' }]
    }
    console.log(params)
    return await ddbDocClient.send(new ExecuteStatementCommand(params));
}


selectAll()
.then(d => console.log(d.Items))

ddbDocClient 是这样创建的:

 const ddbDocClient = DynamoDBDocumentClient.from(ddbClient);

命令导入不正确。要发送和接收本机 JS 类型,请从 @aws-sdk/lib-dynamodb“文档客户端”包中导入 ExecuteStatementCommand 命令。

const { ExecuteStatementCommand } = require('@aws-sdk/lib-dynamodb');

您正在从“常规客户端”包 @aws-sdk/client-dynamodb 导入命令,即接受 returns DynamoDB JSON.

的命令

注意:Parameters: [{ S: '3' }] 行也是错误的,但目前不会造成问题,因为您的语句正在扫描所有记录。如果要在语句中包含 WHERE id=? 短语,请确保将参数更改为 Parameters: ['3']。您必须将 JS 类型传递给“文档客户端”命令。

您需要使用简单的库 https://www.npmjs.com/package/@aws-sdk/util-dynamodb

然后像这样使用:

const { DynamoDB } = require("@aws-sdk/client-dynamodb");
const { marshall, unmarshall } = require("@aws-sdk/util-dynamodb");

const client = new DynamoDB(clientParams);
const params = {
  TableName: "Table",
  Key: marshall({
    HashKey: "hashKey",
  }),
};

const { Item } = await client.getItem(params);
unmarshall(Item);