Я новичок в этой технологии. Так что терпите мое объяснение ниже.
Мой вариант использования:
Я обновляю элемент в Dynamodb на основе первичного ключа (ID). В основном моя запись состоит из 4 столбцов (ID, описание, имя, цена).
Проблема здесь в том, что, предположим, у меня есть элемент с ключом 123.
ID description name price
123 Model nokia 10
когда я использую вышеуказанную функцию lamda для обновления всех столбцов, она работает нормально.
Но когда я пытаюсь обновить только столбец description, возникает ошибка «ExpressionAttributeValues не может быть пустым». Поэтому для этого я сделал что-то вроде этого
ExpressionAttributeValues:{
":d":event.description ? event.description : null ,
":n":event.name ? event.name : null,
":p":event.price ? event.price : null
}
Но проблема в том, что он обновит единственное значение, которое я указал.
Например, если бы я дал только descriptionmodal1, тогда он изменит это и даст такой результат
ID description name price
123 Model1 null null
Это правильно, потому что этот фрагмент выше говорит об этом.
Чего я хочу достичь?
Как я могу изменить это поведение, чтобы оно стало таким?
ID description name price
123 Model1 nokia 10
Любая помощь приветствуется
Обновленный код
var AWS = require("aws-sdk");
AWS.config.update({
region: "regionname",
endpoint: "endpointurl"
});
var docClient = new AWS.DynamoDB.DocumentClient()
var tablename = "Example";
var UpdateExpression = "'set";
var ExpressionAttributeValues= {};
var ExpressionAttributeNames= {};
var ID = "xx";
var description = "Iphone";
var name = "xx";
var price = 50;
var params = {
TableName: tablename,
Key:{
"ID": ID
}
};
docClient.update(params,onUpdate);
function onUpdate(err) {
if (err) {
console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.info("Update succeeded.");
}
if (description) {
UpdateExpression = UpdateExpression + " description = :d,",
ExpressionAttributeValues [":d"] = description ,
console.info("first...")
}
if (name){
UpdateExpression = UpdateExpression + " #na = :n,",
ExpressionAttributeNames['#na'] = 'name' ,
ExpressionAttributeValues[":n"] = name ,
console.info("second...")
}
if (price){
UpdateExpression = UpdateExpression + " price = :p',",
ExpressionAttributeValues[":p"] = price ,
console.info("third...")
}
console.info(UpdateExpression)
console.info(ExpressionAttributeNames)
console.info(ExpressionAttributeValues)
return (UpdateExpression,ExpressionAttributeNames,ExpressionAttributeValues)
}
Когда я запустил код, я получил следующий результат:
D: \ Dynamo> узел FullUpdate.js
Update succeeded.
first...
second...
third...
'set description = :d, #na = :n, price = :p',
{ '#na': 'name' }
{ ':d': 'Iphone', ':n': 'xx', ':p': 50 }



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны составить свой запрос в зависимости от переменных, которые у вас есть, поэтому вам нужно сделать что-то вроде этого
UpdateExpression = "set";
ExpressionAttributeValues: {};
ExpressionAttributeNames: {};
if (event.description){
UpdateExpression = UpdateExpression + "description = :d";
ExpressionAttributeValues[":d"] = event.description
}
if (event.name){
UpdateExpression = UpdateExpression + "#na = :n";
ExpressionAttributeNames['#na'] = 'name'
ExpressionAttributeValues[":d"] = event.name
}
if (event.price){
UpdateExpression = UpdateExpression + "price = :p";
ExpressionAttributeValues[":d"] = event.pice
}
будьте осторожны с запятыми и зарегистрируйте свой запрос, чтобы убедиться, что он соответствует вашим ожиданиям. вы можете проверить функцию, которую я использую для этой цели,
update(_id, store_id, opts?) {
var Key = {
_id: _id,
store_id: store_id
};
if (Object.keys(opts).length > 0) {
let UpdateExpression =
"SET #date = :date, #author = :author";
let ExpressionAttributeNames = {
"#date": "date",
"#author": "author"
}
let ExpressionAttributeValues = {
":date": new Date().getTime(),
":author": localStorage.getItem('user_id')
}
if ((opts && opts.title)) {
UpdateExpression = UpdateExpression + "#title = :title,";
ExpressionAttributeNames["#title"] = "title";
ExpressionAttributeValues[":title"] = opts.title
}
if ((opts && opts.category)) {
UpdateExpression = UpdateExpression + "#category = :category,";
ExpressionAttributeNames["#category"] = "category";
ExpressionAttributeValues[":category"] = opts.category
}
if ((opts && opts.category)) {
UpdateExpression = UpdateExpression + "#dimension = :dimension,";
ExpressionAttributeNames["#dimension"] = "dimension";
ExpressionAttributeValues[":dimension"] = opts.dimension
}
if ((opts && opts.category)) {
UpdateExpression = UpdateExpression + "#destination = :destination,";
ExpressionAttributeNames["#destination"] = "destination";
ExpressionAttributeValues[":destination"] = opts.destination
}
if ((opts && opts.category)) {
UpdateExpression = UpdateExpression + "#timeStart = :timeStart,";
ExpressionAttributeNames["#timeStart"] = "timeStart";
ExpressionAttributeValues[":timeStart"] = opts.timeStart
}
if ((opts && opts.category)) {
UpdateExpression = UpdateExpression + "#timeEnd = :timeEnd,";
ExpressionAttributeNames["#timeEnd"] = "timeEnd";
ExpressionAttributeValues[":timeEnd"] = opts.timeEnd
}
if ((opts && opts.publish)) {
UpdateExpression = UpdateExpression + "#publish = :publish,"
ExpressionAttributeNames["#publish"] = "publish"
ExpressionAttributeValues[":publish"] = "x";
}
UpdateExpression = UpdateExpression.replace(new RegExp(',$'), '');
if ((opts && opts.nbviews)) {
UpdateExpression = UpdateExpression + "ADD #nbviews = :nbviews"
ExpressionAttributeNames["#nbviews"] = "nbviews"
ExpressionAttributeValues[":nbviews"] = 1;
}
if ((opts && !opts.publish)) {
UpdateExpression = UpdateExpression + " REMOVE #publish"
ExpressionAttributeNames["#publish"] = "publish"
}
return this.dataService.update(TABLENAME, Key, UpdateExpression, null, ExpressionAttributeNames, ExpressionAttributeValues);
я не понимаю, что вы имеете в виду, говоря "не принимаю. в if (event.description)"?
Он показывает parsing error : unexpected token в лямбда-консоли.
Можно показать код, который вы используете, на самом деле я реализовал указанную выше функцию в лямбда
Ох, хорошо. Может быть, я что-то упускаю. Код находится в разделе UPDATE моего вопроса.
вы не можете использовать оператор IF в объекте, проверьте свой код в ExpressionAttributeNames: {.... и закройте его перед IF!
Спасибо @Temkit. Но я не могу использовать этот подход в лямбде, потому что он не принимает
.вif (event.description).