#node.js #amazon-web-services #aws-lambda #amazon-dynamodb
Вопрос:
У меня есть лямбда, написанная в node.js где я хочу перенести данные в свою таблицу dynamodb. Моя конечная цель состоит в том, чтобы мой запрос api получил ответ, а затем передал результаты в разделе «Элементы» непосредственно в dynamodb, но в данный момент моя лямбда-функция только выполняет запрос, а функция createmessage игнорируется (в настоящее время тестируется со статическими данными). Я предполагаю, что мой код каким-то образом запутан, поэтому мне нужна помощь в том, как это работает правильно, пожалуйста, смотрите Ниже:
// Loads in the AWS SDK
const AWS = require('aws-sdk');
// Creates the document client specifing the region
// The tutorial's table is 'in eu-west-2'
const ddb = new AWS.DynamoDB.DocumentClient({region: 'eu-west-2'});
exports.handler = async (event, context, callback) => {
// Captures the requestId from the context message
const requestId = context.awsRequestId;
// Handle promise fulfilled/rejected states
await createMessage(requestId).then(() => {
callback(null, {
statusCode: 201,
body: '',
headers: {
'Access-Control-Allow-Origin' : '*'
}
});
}).catch((err) => {
console.error(err)
})
};
// Function createMessage
// Writes message to DynamoDb table Message
function createMessage(requestId) {
const params = {
TableName: 'splunk-lambda',
Item: {
'id' : '101',
'message' : 'Hello from lambda'
}
}
return ddb.put(params).promise();
}
var request = require('request');
var options = {
'method': 'POST',
'url': 'myurl',
'headers': {
'x-api-key': 'my-api-key',
'Content-Type': 'text/plain'
},
body: 'query my graphql query'
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
мой ответ от лямбды:
Test Event Name
test
Response
null
Function Logs
{my graphql response}
END RequestId: bdf23337-ca51-4f8b-868c-314f4d048055
Комментарии:
1. Вероятно, это как-то связано с вашим использованием
async
. Поскольку вы используете асинхронный обработчик, ваш лямбда-код завершается до того, как у остальной части кода появится возможность запуска.2. Марцин, вероятно, прав — я не уверен на 100% в том, что node.js, но SDK для Python блокирует асинхронность — необходимо использовать определенную асинхронную версию SDK, чтобы использовать ее в асинхронных функциях. Я бы рискнул предположить, что node.js версия может иметь некоторые аналогичные проблемы.
3. есть ли какая-то особая причина, по которой он должен быть асинхронным? SDK всегда будет ждать ответа от своего вызова, прежде чем продолжить. Если это часть гораздо более масштабного и сложного процесса, попробуйте включить его в собственную лямбду и разделить ваши лямбды на параллельные шаги в пошаговой функции
4. @Marcin ваше право, асинхронность была блокировщиком, а удаление и перезапись решили проблему. Не могли бы вы преобразовать свой комментарий в ответ?
5. @FreshX Спасибо. Ответ добавлен.
Ответ №1:
Основываясь на комментариях.
Проблемы были вызваны использованием асинхронного обработчика. Это приводит к тому, что ваша функция завершается до того, как у нее появится возможность запустить весь свой код.
Один из способов преодолеть это-обернуть свой код в обработчик, new Promise
как показано в документах AWS.