You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么DynamoDB用UpdateExpression更新返回500 InternalFailure且卡顿30秒

问题根源

你触发500错误的核心原因是违反了DynamoDB表达式的占位符使用规范:

  • DynamoDB表达式中,属性名的动态占位符必须使用#作为前缀,在ExpressionAttributeNames中定义
  • 只有值的动态占位符才使用:作为前缀,在ExpressionAttributeValues中定义

你当前代码把动态属性名overrideAttr错误放到了ExpressionAttributeValues中,且在表达式里用了值占位符的前缀:,服务端无法解析该异常语法,才返回内部错误。卡顿30秒是AWS SDK默认对标记为retryable: true的错误自动重试导致的总耗时。

修正方案

你需要调整占位符写法,拆分属性名和值的定义:

修正后的请求参数示例:

{
  "TableName": "AppVersions",
  "Key": { "Environment": "int" },
  "UpdateExpression": "SET Overrides.#overrideAttr = :emptylist",
  "ConditionExpression": "attribute_not_exists(Overrides.#overrideAttr)",
  "ExpressionAttributeNames": {
    "#overrideAttr": "EyeTrackerType"
  },
  "ExpressionAttributeValues": {
    ":emptylist": []
  }
}

修正后的完整函数代码:

export async function addOverride(addOverrideRequest: any) {
    const addListIfNotExists = {
        TableName: addOverrideRequest.table,
        Key: {
            Environment: addOverrideRequest.environment
        },
        UpdateExpression: "SET Overrides.#overrideAttr = :emptylist",
        ConditionExpression: "attribute_not_exists(Overrides.#overrideAttr)",
        ExpressionAttributeNames: {
            "#overrideAttr": addOverrideRequest.overrideField,
        },
        ExpressionAttributeValues: {
            ":emptylist": [],
        },
    }

    try {
        const result = await DOCUMENT_CLIENT.update(addListIfNotExists).promise();
    } catch (error) {
        throw error;
    }
}

验证说明

调整后服务端可正常解析表达式,不会再触发500内部错误。如果满足条件表达式规则,更新操作会正常执行;如果对应属性已存在,会返回明确的ConditionalCheckFailedException错误,可根据业务需要处理。

内容的提问来源于stack exchange,提问作者John Goben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:15:01