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

DynamoDB使用变量键值查询报错:无法读取'datatype'属性

解决DynamoDB getItem调用中的TypeError问题

我来帮你拆解问题并给出修复方案:

核心问题分析

你碰到的TypeError: Cannot read property 'datatype' of undefined错误,根源是几个代码顺序和变量处理的问题:

  • 变量定义顺序颠倒:你在datetime1完成赋值前就定义了params对象,此时datetime1是undefined,DynamoDB无法解析一个未定义的Key值,这直接触发了类型错误。
  • 多余的JSON.stringify操作:你把日期字符串转成了带外层双引号的格式(比如"2018-01-09"),但手动传入值时用的是纯字符串"2018-01-09"(实际传递的是不带外层引号的内容),这会导致Key不匹配,同时让DynamoDB无法正确识别数据类型。
  • 回调函数调用时机错误:你在所有变量准备完成前就调用了callback(),而且回调函数定义的message参数也没有实际作用。

修正后的代码

exports.handler = function(event, context) {
    console.log("Request received:\n", JSON.stringify(event));
    console.log("Context received:\n", JSON.stringify(context));
    
    var doc = require('dynamodb-doc');
    var dynamodb = new doc.DynamoDB();
    
    // 先处理日期,得到正确的纯字符串格式
    var datetiem = new Date().toISOString().split('T')[0];
    console.log('date is ', datetiem); // 输出 2018-01-09
    // 移除多余的JSON.stringify,直接使用纯字符串
    var datetime1 = datetiem;
    console.log(datetime1); // 输出 2018-01-09
    
    // 确保datetime1赋值完成后,再定义params对象
    var params = {
        Key: { "abc" : datetime1 },
        TableName: 'myTable',
        ProjectionExpression: 'message'
    };
    
    // 重写回调函数,移除无用的message参数
    function callback() {
        dynamodb.getItem(params, function (err, data) {
            if (err) {
                context.fail('ERROR: Dynamo failed: ' + err);
            } else {
                console.log('Dynamo Success: ' + JSON.stringify(data, null, ' '));
                console.log('data', data);
                // 增加空值判断,避免找不到数据时出现新错误
                if (data.Item) {
                    let Message = data.Item.message;
                    console.log('test', Message);
                    // Lambda需要明确标记执行成功
                    context.succeed(Message);
                } else {
                    console.log('No item found for the given date');
                    context.succeed(null);
                }
            }
        });
    }
    
    // 所有变量准备完成后,再调用回调函数
    callback();
};

关键修复细节

  1. 调整变量顺序:先计算出有效的日期字符串,再定义params,确保Key值是合法的字符串。
  2. 移除冗余序列化:直接使用new Date().toISOString().split('T')[0]返回的纯字符串,和手动传入的格式保持一致。
  3. 修正回调执行时机:在所有变量初始化完成后调用callback(),保证DynamoDB请求参数是完整有效的。
  4. 增加空值防护:检查data.Item是否存在,避免因找不到对应数据引发新的错误。
  5. 补充Lambda结束标记:调用context.succeed明确告知Lambda函数执行完成,避免出现超时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:28:08