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

Node.js Lambda对比DynamoDB日期遇UnexpectedParameter错误求助

问题排查与解决

错误原因分析

  1. 参数格式错误:错误信息提到ExpressionAttributeValues[':date']存在意外键7,说明你实际运行的代码可能将占位符从:d改成了:date,且直接传入了字符串而非DynamoDB低级API要求的带类型标识的对象。JavaScript中字符串是类数组对象,SDK解析时会识别到数字索引键(如字符位置索引),从而触发参数错误。
  2. 日期格式不匹配:你的DynamoDB表中date字段为YYYY-DD-MM格式,但代码中new Date().toISOString().split('T')[0]生成的是YYYY-MM-DD,即使语法正确也无法匹配到目标数据。
  3. 结果判断逻辑错误:原代码仅判断查询是否成功,而非是否存在匹配的节假日,会出现“查询无结果却返回true”的问题。

修正后的代码(低级API版本)

var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });

exports.handler = async (event) => {
    var tableName = "table";

    // 将当前日期转换为表要求的YYYY-DD-MM格式
    const now = new Date();
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0');
    const day = String(now.getDate()).padStart(2, '0');
    const currentDate = `${year}-${day}-${month}`;

    try {
        var params = {
            KeyConditionExpression: '#D = :d',
            ExpressionAttributeValues: {
                ':d': { S: currentDate } // 严格遵循低级API的属性值格式,S表示字符串类型
            },
            ExpressionAttributeNames: {
                '#D': 'date'
            },
            TableName: tableName
        };
        var result = await dynamodb.query(params).promise();
        
        // 根据是否查询到匹配数据返回对应结果
        return result.Items.length > 0;
    } catch (error) {
        console.error(error);
        return false;
    }
};

更简洁的DocumentClient版本

如果使用DynamoDB DocumentClient,无需手动指定数据类型,代码更简洁:

var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });

exports.handler = async (event) => {
    var tableName = "table";

    const now = new Date();
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0');
    const day = String(now.getDate()).padStart(2, '0');
    const currentDate = `${year}-${day}-${month}`;

    try {
        var params = {
            KeyConditionExpression: '#D = :d',
            ExpressionAttributeValues: {
                ':d': currentDate // DocumentClient自动处理数据类型
            },
            ExpressionAttributeNames: {
                '#D': 'date'
            },
            TableName: tableName
        };
        var result = await docClient.query(params).promise();
        
        return result.Items.length > 0;
    } catch (error) {
        console.error(error);
        return false;
    }
};

关键修正点

  • 统一日期格式:手动拼接生成YYYY-DD-MM格式的日期,与表中字段格式对齐。
  • 规范参数格式:低级API必须使用{类型标识: 值}的结构传递属性值;DocumentClient可直接传原始值。
  • 修正结果判断:通过Items.length判断是否存在匹配的节假日,符合需求逻辑。

内容的提问来源于stack exchange,提问作者aws demo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:40:23