#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();