Lambda中使用@aws-sdk/lib-dynamodb执行BatchWriteCommand遇类型错误
解决DynamoDB BatchWriteCommand的TypeScript类型错误
问题根源
你的代码存在几个关键错误,直接导致了类型报错:
- RequestItems格式错误:你用数组
[]包裹表名和请求,但AWS SDK要求RequestItems是对象类型(键为表名,值为请求数组),数组格式完全不符合SDK的类型定义。 - 环境变量类型未处理:
process.env的属性类型是string | undefined,TypeScript会严格检查这种可能为undefined的值,即使硬编码表名也会因格式错误延续问题。 - 变量名大小写不一致:定义的
field1是小写,代码里却用了Field1,会导致运行时未定义错误。 - 函数缺失async关键字:函数内使用了
await但未标记为async,属于语法错误。
修正后的代码
import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { DynamoDBDocumentClient, BatchWriteCommand } from "@aws-sdk/lib-dynamodb"; import { randomUUID } from "crypto"; const client = new DynamoDBClient({}); const ddbDocClient = DynamoDBDocumentClient.from(client); // 提前校验环境变量,避免undefined类型问题 const TABLE_1_NAME = process.env.TABLE_1_NAME; const TABLE_2_NAME = process.env.TABLE_2_NAME; if (!TABLE_1_NAME || !TABLE_2_NAME) { throw new Error("Missing required table name environment variables"); } const writeToDatabases = async (body: { field1: unknown; field2: unknown }) => { const Id = randomUUID(); const field1 = String(body.field1); const field2 = String(body.field2); const response = await ddbDocClient.send( new BatchWriteCommand({ RequestItems: { // 使用对象键值对替代数组,符合SDK类型要求 [TABLE_1_NAME]: [ { PutRequest: { Item: { Id: Id, Field1: field1 // 修正变量名大小写 } } } ], [TABLE_2_NAME]: [ { PutRequest: { Item: { Id: Id, Field2: field2 // 修正变量名大小写 } } } ] } }) ); return response; };
关键修正说明
- RequestItems改为对象结构:将原数组
[]替换为对象{},用计算属性[TABLE_1_NAME]动态指定表名,完全匹配SDK的类型定义。 - 环境变量提前校验:取出环境变量后立即检查是否存在,既解决了TypeScript的undefined类型报错,也能在函数启动时快速发现配置缺失问题。
- 统一变量名大小写:修正
field1/field2的引用一致性,避免运行时的未定义错误。 - 添加async关键字:函数内使用
await必须标记为async,修复语法错误。
内容的提问来源于stack exchange,提问作者user7195808
相关产品推荐
相关产品推荐

