错误:预期params.Item ['id'].N是一个字符串

Ama*_*day 0 lambda amazon-web-services aws-lambda

这是交易:

我无法将数据添加到DynamoDB.JS文件在S3中,这是代码:

var date = new Date(),
    item = {
        'id': {N: date.getTime()},
        'user': {S: "Sam"}
    },
    params = {
        TableName: 'users',
        Item: item
    };
dynamodb.putItem(params,function(err,data){
    if (err) {
        console.log(err);
    } else {
        console.log("user added to DynamoDB");
    }
});
Run Code Online (Sandbox Code Playgroud)

这是来自DB的截图,这意味着id应该是一个数字,而不是字符串:

在此输入图像描述

我得到的错误:

错误:预期params.Item ['id'].N是一个字符串

at ParamValidator.fail (aws-sdk.js:96666)
at ParamValidator.validateType (aws-sdk.js:96827)
at ParamValidator.validateString (aws-sdk.js:96762)
at ParamValidator.validateScalar (aws-sdk.js:96742)
at ParamValidator.validateMember (aws-sdk.js:96709)
at ParamValidator.validateStructure (aws-sdk.js:96690)
at ParamValidator.validateMember (aws-sdk.js:96703)
at ParamValidator.validateMap (aws-sdk.js:96729)
at ParamValidator.validateMember (aws-sdk.js:96707)
at ParamValidator.validateStructure (aws-sdk.js:96690)
Run Code Online (Sandbox Code Playgroud)

Raf*_*ael 13

我自己就是这个问题.

Dynamo期望"N"值是一个字符串,它有点误导,因为你希望传递一个数字.

你有date.getTime()的地方,试着把它翻译成一个字符串.

'id': { N: date.getTime().toString() },
Run Code Online (Sandbox Code Playgroud)

这对我有用.


Ode*_*ner 5

即使您想保存为DynamoDB 中的数字,您仍然需要向SDK发送一个字符串,因此,您需要:

var date = new Date(),
    item = {
        'id': {N: date.getTime().toString()},
        'user': {S: "Sam"}
    },
    params = {
        TableName: 'users',
        Item: item
    };
dynamodb.putItem(params,function(err,data){
    if (err) {
        console.log(err);
    } else {
        console.log("user added to DynamoDB");
    }
});
Run Code Online (Sandbox Code Playgroud)


Yes*_*rni 2

  1. 当您创建 DynamoDB 表时,您提供的 id(应该是 HashKey?)参数的数据类型可能是 String 而不是 Number。
  2. 当您尝试向表中添加项目时,您可能将其作为数字提供(基于 new Date().getTime())。
  3. 请检查您最初发出的创建表命令。
  4. 要解决此问题,您可能需要删除该表,然后使用 id 属性的正确数据类型重新创建该表。