#node.js #amazon-web-services #amazon-dynamodb
#node.js #amazon-веб-сервисы #amazon-dynamodb
Вопрос:
У меня есть созданная мной лямбда-функция DeleteItem, которая удаляет элемент, если найден его идентификатор пользователя. Идентификатор пользователя передается как a pathParameter
, и он работает без проблем, если идентификатор пользователя найден.
let output = await deleteUser(userId);
console.log("output: " JSON.stringify(output))
всегда возвращает output: undefined
каждый раз, независимо от того, найдено и удалено оно или нет. Мне нужен ответ от deleteItem
операции, чтобы я мог вернуть сообщение User not found
или User deleted
на основе этого ответа.
Как я могу заставить обратный вызов dynamodb работать должным образом?
delete.js
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
const dynamoDB = new AWS.DynamoDB();
const tableName = process.env.TABLE_NAME;
exports.handler = async (event) => {
let userId = event.pathParameters.userid;
try {
let output = await deleteUser(userId);
console.log("output: " JSON.stringify(output))
return {
statusCode: 200,
body: JSON.stringify({
message: "User deleted"
})
};
} catch (err) {
console.log("ERROR TIME")
console.log("ERROR:" err)
return {
statusCode: 500,
body: JSON.stringify({
message: "User failed to be deleted"
})
};
}
async function deleteUser(userId) {
let params = {
TableName: tableName,
"Key": {
"userid": {
"S": userId.toString()
}
}
};
try {
const dbResponse = await dynamoDB.deleteItem(params).promise();
console.log("dbResponse")
console.log(dbResponse)
if (dbResponse.Item) {
console.log(`deleted row with userId of ${userId}`);
return (dbResponse);
}
} catch (err) {
console.log(`user reset failed with ${err}`);
return {
statusCode: 500,
body: JSON.stringify({
errr: err
})
};
}
}
};
Ответ №1:
Это связано dbResponse
с тем, что у него нет имени свойства Item
, поэтому это условие никогда не выполняется:
if (dbResponse.Item) {
Я предлагаю просмотреть документацию, чтобы узнать, каков ожидаемый формат ответа, или, по крайней мере, войти dbResponse
, чтобы вы могли видеть, что возвращается.
Комментарии:
1. Я добавил журнал консоли
const dbResponse = await dynamoDB.deleteItem(params).promise();
в исходный вопрос для демонстрации. В первый раз я попытался удалить идентификатор пользователя, который не существует. Во второй раз я удалил элемент, который существует (успешно). Оба раза выводconsole.log(dbResponse)
был{}
, даже если Item не является именем свойства, он должен возвращать что-то при выполнении операции DeleteItem . У вас есть какие-либо предположения о том, почему это происходит?2. Как вы думаете, почему он всегда должен что-то возвращать? Вы не устанавливаете
ReturnConsumedCapacity
ReturnItemCollectionMetrics
илиReturnValues
, поэтому он ничего не вернет. Пожалуйста, найдите время, чтобы прочитать документацию.3. Спасибо за совет!