调用 RDS 数据服务 executeStatement 抛出 "Parameter X has value with no field set"

Calling RDS data service executeStatement throws "Parameter X has value with no field set"

不确定我是否清楚地理解了在执行rds.executeStatement命令时如何提供参数值。

当我执行下面的代码时,我抛出了这个错误 -

{
  "errorType": "BadRequestException",
  "errorMessage": "Parameter \"userId\" has value with no field set",
  "code": "BadRequestException",
  "message": "Parameter \"userId\" has value with no field set"
}

这是我的代码,我应该如何向此处的参数数组提供 userId 和 givenName 值。

const AWS = require('aws-sdk');
var RDS = new AWS.RDSDataService({
    apiVersion: '2018-08-01'
});

exports.handler = async (event, context) => {
    var userId;
    var givenName;

    var params = {
        secretArn: 'secretArn',
        resourceArn: 'resourceArn',
        database: 'db',
        parameters: [{
                name: "userId",
                value: {
                    "stringValue": userId
                }
            },
            {
                name: "givenName",
                value: {
                    "stringValue": givenName
                }
            }
        ]
    };

    event.Records.forEach(function(record) {

        if (record.eventName == 'INSERT') {
            userId = record.dynamodb.NewImage.pk.S;
            givenName = record.dynamodb.NewImage.sk.S;
            params.sql = `INSERT INTO Users (UserId, GivenName) VALUES(:userId, :givenName);`
        }


    });
    await RDS.executeStatement(params).promise();
    console.log(params.parameters[0].value);
    return 'done';
};

3 月 13 日更新 附加 cloudwatch 日志打印出 userId 和 givenName -

3 月 16 日更新 - 功能更新

const AWS = require('aws-sdk');
const RDS = new AWS.RDSDataService({ apiVersion: '2018-08-01' });

exports.handler = async (event, context) => {
var userId;
var givenName;
var count = 0;

var params = {
    secretArn: 'secretArn',
    resourceArn: 'resourceArn',
    database: 'bol_db',
    parameters: [{
            name: "userId",
            value: {
                "stringValue": userId
            }
        },
        {
            name: "givenName",
            value: {
                "stringValue": givenName
            }
        }
    ]
};

const promises = event.Records.map(async function(record) {
    count++;
    context.callbackWaitsForEmptyEventLoop = false;

    if (record.eventName == 'INSERT') {
        userId = record.dynamodb.NewImage.pk.S;
        givenName = record.dynamodb.NewImage.sk.S;
        console.log('userId - ' + userId);
        console.log('givenName - ' + givenName);
        console.log('Params -'+params.parameters);
        params.sql = "INSERT INTO Users (UserId, GivenName) VALUES(:userId, :givenName);"
        let result = await RDS.executeStatement(params).promise();
        console.log('Result -' + result);
    }
});

await Promise.all(promises);
console.log(count);
return 'done';
};

您似乎在 userId 有值之前设置了 "stringValue": userId。在 JavaScript 中,您不能稍后分配 userId 并期望它传播到您之前使用它的所有地方。

您应该尝试在 .map 函数内使用 var params = {...},或者在 .map 函数内您可以循环遍历参数列表,如果找到正确的参数,则赋值然后的值。