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(); };
关键修复细节
- 调整变量顺序:先计算出有效的日期字符串,再定义
params,确保Key值是合法的字符串。 - 移除冗余序列化:直接使用
new Date().toISOString().split('T')[0]返回的纯字符串,和手动传入的格式保持一致。 - 修正回调执行时机:在所有变量初始化完成后调用
callback(),保证DynamoDB请求参数是完整有效的。 - 增加空值防护:检查
data.Item是否存在,避免因找不到对应数据引发新的错误。 - 补充Lambda结束标记:调用
context.succeed明确告知Lambda函数执行完成,避免出现超时问题。
内容的提问来源于stack exchange,提问作者arjain13
相关产品推荐
相关产品推荐

