Я использую AWS для отправки запросов к базе данных в DynamoDB с ролями и политиками пользователя/IAM Cognito.
Похоже, мои параметры для моего запроса в DynamoDB недействительны.
Моя ошибка: dynamodb.html: 150 ValidationException: одно или несколько значений параметра были недопустимыми: тип параметра условия не соответствует типу схемы
Я пытался добавить: ProjectionExpression: "name"
, потому что это один из моих атрибутов, но name
, по-видимому, зарезервированное слово, поэтому я не могу его использовать. Также я попробовал age
вместо этого, потому что это еще один атрибут, который у меня есть, но я получаю ту же начальную ошибку, что и выше. Поэтому я удалил ProjectionExpression:
вообще. Вот что у меня сейчас есть для моих параметров:
var params = {
ExpressionAttributeValues: {
":v1": {
N: 123456788
}
},
KeyConditionExpression: "userId = :v1",
TableName: "user"
};
Я не очень уверен, как еще это оформить. Пожалуйста, дайте мне знать, чего мне не хватает, или есть ли хорошая документация, так как я новичок в AWS. Заранее спасибо!
Обновлено:
Первичный ключ — это userId
, а остальные атрибуты таблицы user
: age
, bio
, email
, name
по порядку.
Войдите и запросите роль IAM
var data2 = {
UserPoolId: 'xxxxxxxx',
ClientId: 'xxxxxxxx',
};
var userPool = new AmazonCognitoIdentity.CognitoUserPool(data2);
var cognitoUser = userPool.getCurrentUser();
var userData = {
Username : 'xxxxxxxx',
Pool : userPool
};
var authenticationData = {
Username : 'xxxxxxxx',
Password : 'xxxxxxxx',
};
var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
var cognitoUser2 = new AmazonCognitoIdentity.CognitoUser(userData);
cognitoUser2.authenticateUser(authenticationDetails, {
onSuccess: function (result) {
var accessToken = result.getAccessToken().getJwtToken(); //user sign-in success and you can get accessToken and IdToken
//POTENTIAL: Region needs to be set if not already set previously elsewhere.
AWS.config.region = 'xxxxxxxx';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId : 'xxxxxxxx', // your identity pool id here
Logins : {
// Change the key below according to the specific region your user pool is in.
// Here you need to map your idToken with your user pool domain for Cognito Identity Pool to generate a Identity with credential.
'cognito-idp.xxxxxxxx.amazonaws.com/xxxxxxxx' : result.getIdToken().getJwtToken()
}
});
//refreshes credentials using AWS.CognitoIdentity.getCredentialsForIdentity()
AWS.config.credentials.refresh((error) => {
if (error) {
console.error(error);
} else {
console.info('Successfully logged!');
// Instantiate aws sdk service objects now that the credentials have been updated. So put your DynamoDB client here
var docClient = new AWS.DynamoDB.DocumentClient({ region: AWS.config.region });
var params = {
ExpressionAttributeValues: {
":v1": {
N: 123456788
}
},
KeyConditionExpression: "userId = :v1",
TableName: "user"
};
docClient.query(params, function(err, data2) {
if (err) {
console.error(err);
}else{
console.info(data2);
}
});
}
});
},
onFailure: function(err) {
alert(err.message || JSON.stringify(err));
},
});
и можете ли вы показать нам, как вы запрашиваете таблицу в своем коде?
обновлен/отредактирован с некоторым кодом. У меня есть только один первичный ключ, это userId
этот userId имеет тип Number
?
Попробуйте использовать его без N
в ExpressionAttributeValues
и используйте "
для значения идентификатора пользователя.
var params = {
ExpressionAttributeValues: {
":v1": "123456788"
},
KeyConditionExpression: "userId = :v1",
TableName: "user"
};
какой у вас ключ(и) в этой таблице?