使用DynamoDBDocumentClient与UpdateCommand时遇TypeError错误求助
在AWS Lambda运行代码时遇到以下错误,错误栈指向docClient.send(updateCommand)代码行,已确认updateCommand是UpdateCommand类型,但仍无法定位问题:
错误信息
{ "errorType": "TypeError", "errorMessage": "command.resolveMiddleware is not a function", "stack": [ "TypeError: command.resolveMiddleware is not a function", " at _DynamoDBDocumentClient.send (/var/task/node_modules/@smithy/smithy-client/dist-cjs/index.js:111:29)", " at Runtime.handler (file:///var/task/index.js:28:25)", " at process.processTicksAndRejections (node:internal/process/task_queues:95:5)" ] }
相关代码
import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { DynamoDBDocumentClient, UpdateCommand } from "@aws-sdk/lib-dynamodb"; const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); export const handler = async (event) => { const { userId, id, processedPurchases } = event; const key = { userId: userId, id: id }; try { const updateCommand = buildUpdateCommand(key, processedPurchases); console.log(updateCommand); await docClient.send(updateCommand); } catch(e) { console.error(`There was an error processing transaction ${id} from ${userId}`, e); throw e; } }; function buildUpdateCommand(key, processedPurchases) { const pPurchases = [some code] const orderEvent = {some code} const updateCommand = new UpdateCommand({ TableName: process.env.TABLENAME, Key: key, UpdateExpression: 'SET orderHistory = list_append(orderHistory, :orderEvent), SET processedPurchases = :processedPurchases', ExpressionAttributeValues: { ':processedPurchases': pPurchases, ':orderEvent': orderEvent } }); return updateCommand; }
解决方法
统一SDK包版本:
@aws-sdk/client-dynamodb和@aws-sdk/lib-dynamodb必须使用完全一致的版本,因为lib-dynamodb依赖client-dynamodb的内部实现,版本不匹配会导致命令对象无法被docClient正确识别。检查package.json中的版本号,将两个包升级或降级到同一稳定版本,重新安装依赖后重新部署。确认UpdateCommand导入来源:确保
UpdateCommand是从@aws-sdk/lib-dynamodb导入,而非@aws-sdk/client-dynamodb。DynamoDBDocumentClient需要使用lib-dynamodb封装后的命令,原始client-dynamodb的命令无法被其正确处理。清理依赖缓存:Lambda部署时可能存在旧依赖缓存,导致运行时加载的代码存在异常。本地删除
node_modules、package-lock.json(或yarn.lock),重新安装依赖后打包部署;也可以在Lambda控制台重新部署并清理部署包缓存。检查UpdateCommand参数格式:虽然表面类型正确,但参数错误可能导致命令对象内部初始化异常。比如
UpdateExpression中使用list_append时,第二个参数必须是数组,若orderEvent是单个对象,需改为:orderEvent: [orderEvent],否则不仅会触发DynamoDB逻辑错误,还可能间接导致命令对象的方法缺失。
内容的提问来源于stack exchange,提问作者chinahalffull

