Как выполнить обновление в базе данных AWS Dynamo с помощью NodeJS

#javascript #node.js #express #amazon-dynamodb

#язык JavaScript #node.js #экспресс #amazon-dynamodb

Вопрос:

Я написал эту функцию для обновления в таблице динамо

 const updateTask = async (req, res) =gt; {  try {  const { existingTaskText,updatedTaskText } = req.body;  console.log(existingTaskText,updatedTaskText );  UPDATE({  TableName: "todos",  Key:{ task: existingTaskText},  UpdateExpression:"set task = :task",  ExpressionAttributeValues: {":task": updatedTaskText},  });  res.status(200).json({ data: "this is controller" });  } catch (error) {  res.status(400).json({ message: error.message });  } };  

это вызывает ОБНОВЛЕНИЕ

 const UPDATE = async (payload) =gt; {  try {  console.log(payload);  const updateDoc = await dbClient  .update({  TableName: payload.TableName,  Key: payload.Key,  UpdateExpression: payload.UpdateExpression,  ExpressionAttributeNames:payload.ExpressionAttributeNames,  ReturnValues: "UPDATED_NEW",  })  .promise();  console.log(updateDoc);  } catch (error) {  console.log(error);  } };  

Когда я тестирую это в postman, я получаю эту ошибку

 ValidationException: Invalid UpdateExpression: An expression attribute value used in expression is not defined; attribute value: :task  

это передача журнала полезной нагрузки

 {  TableName: 'todos',  Key: { task: 'see its done' },  UpdateExpression: 'set task = :task',  ExpressionAttributeValues: { ':task': 'edited' } }  

Ответ №1:

Я сделал ниже общие функции для обновления, получения и создания таблицы.используйте то же самое.

 const AWS = require('aws-sdk'); AWS.config.update({ region: "us-east-1",accessKeyId : process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY }); const dynamoDB = new AWS.DynamoDB() const documentClient = new AWS.DynamoDB.DocumentClient();  const Dynamo = {  async get(id, TableName) {  const params = {  TableName,  Key: {  id,  },  };   const data = await documentClient.get(params).promise();   if (!data || !data.Item) {  throw Error(`There was an error fetching the data for ID of ${id} from ${TableName}`);    }  console.log(data);   return data.Item;  },  async getall(TableName) {  const params = {  TableName: TableName,  };   const data = await documentClient.scan(params).promise();   if (!data || !data.Item) {  throw Error(`There was an error fetching the data for ID of ${ID} from ${TableName}`);  }  console.log(data);   return data.Items;  },  async getMany(params) {  const data = await documentClient.scan(params).promise();  console.log(data);  if (!data || !data.Items) {  throw Error(`There was an error fetching the data`);  }   return data.Items;  },   async write(data, TableName) {  console.log('write dynamo',data, TableName);  if (!data.id) {  throw Error('no ID on the data');  }   const params = {  TableName,  Item: data,  };   const res = await documentClient.put(params).promise();   if (!res) {  throw Error(`There was an error inserting ID of ${data.id} in table ${TableName}`);  }  console.log('res of write dynamo ',res);  return data;  },  async createTable(TableName) {  documentClient  .scan({  TableName: TableName,  })  .promise()  .catch(error =gt; {    return new Promise(resolve =gt; {  dynamoDB  .createTable({  AttributeDefinitions: [  {  AttributeName: "id",  AttributeType: "S",  },  ],  KeySchema: [  {  AttributeName: "id",  KeyType: "HASH",  },  ],  BillingMode: "PAY_PER_REQUEST",  TableName: TableName,  })  .promise()  .then(data =gt; console.log("Success!", data))  .catch(console.error)  })  });   },  }; module.exports = Dynamo;  

Ответ №2:

При вызове метода dbClient.update объявляется параметр ExpressionAttributeNames. Это должно быть выражение атрибутов значений. Вот почему сообщение об ошибке указывает, что значение атрибута выражения, используемое в выражении, не определено.

Таким образом, вы можете попробовать изменить вызов dbClient.update таким образом:

 const updateDoc = await dbClient  .update({  TableName: payload.TableName,  Key: payload.Key,  UpdateExpression: payload.UpdateExpression,  ExpressionAttributeValues:payload.ExpressionAttributeValues,  ReturnValues: "UPDATED_NEW",  })  .promise();