🔒 DDB-Table
用于在TypeScript中查询和建模DynamoDB文档的强类型库。
DDB-Table旨在为DynamoDB表提供强类型的数据结构。使用AWS DocumentClient和TypeScript,您可以轻松获取和存储任何JSON文档,并静态验证其结构。查询二级索引并运行复杂的更新表达式,无需在运行时出现任何错误。
await table
.update('demo@example.com')
.set('FullName', 'John Doe')
// 🚨 TypeScript错误:'fullName'不能赋值给'Email' | 'FullName'
.condition((cond) => cond.eq('fullName', 'Johnny Doe'))
.exec();
主要特性
- 强类型 - 为您的数据提供端到端的TypeScript验证。
- 简易查询表达式 - 自动转义名称属性和值。
- 智能投影 - 确保您只访问您投影的字段。
- 查询和扫描索引 - 完全支持全局或本地索引。
- 纯JavaScript - 也可以在不使用TypeScript的情况下工作。
由❤️赞助
如果您喜欢这个项目,请考虑赞助我们,以帮助我们继续维护和改进这个项目。
安装
npm i ddb-table
使用方法
import Table from 'ddb-table';
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
interface MessageSchema {
threadId: string;
timestamp: number;
senderId: string;
message: string;
status: 'sent' | 'received';
tags?: Set<string>;
attachments: {
name: string;
URL: string;
}[];
}
const client = new DynamoDBClient({
// 设置...
});
// 创建基本表定义
const messages = new Table<MessageSchema, 'threadId', 'timestamp'>({
tableName: 'Messages',
primaryKey: 'threadId',
sortKey: 'timestamp',
documentClient: DynamoDBDocument.from(client);
});
const updateRes = await messages
.update('john@gmail.com', 1588191225322)
.set('message', 'Hello World!')
.add('tags', new Set(['unread', 'important']))
.set('attachments', (exp) =>
exp.listAppend([{ name: 'Test', URL: 'demo.com' }]),
)
.return('ALL_NEW')
.exec();
console.log(updateRes.Attributes);
同时使用索引:
// 创建二级索引定义
type SenderTimestampIndex = Pick<
MessageSchema,
'threadId' | 'timestamp' | 'senderId'
>;
const outboxIndex = messages.index<
SenderTimestampIndex,
'senderId',
'timestamp'
>('senderId-timestamp-index', 'senderId', 'timestamp');
const it = outboxIndex
.query()
.keyCondition((cond) => cond.eq('senderId', 'john@gmail.com'))
.keyCondition((cond) =>
cond.between('timestamp', Date.now() - 3600e3, Date.now()),
)
.project({ threadId: 1, message: 1 })
.reverseIndex()
.entries();
for await (const item of it) {
console.log(item);
}
错误处理
import { DynamoDBExceptionName } from 'ddb-table';
try {
await table.put(...).exec();
} catch (err) {
if ((err as DynamoDBServiceException)?.name === DynamoDBExceptionName.ConditionalCheckFailedException) {
// 处理异常
}
}