Это потому, что ваш getParameterFromStore
возвращается до выполнения кода then()
, поэтому parameterResult
равно undefined
.Если вы не хотите слишком сильно изменять свой код, я бы вернул созданное вами обещание, например:
function getParameterFromStore(param){
return new Promise(function(resolve, reject){
console.log('++ ' + param.Path);
servmgr.getParametersByPath(param, function(err, data){
if(err){
reject(console.log('Error getting parameter: ' + err, err.stack));
} else {
resolve(data);
}
});
});
};
И, наконец, на клиенте вашей функции выможно получить такой результат:
const myFirstParam = { Path : '/myPath/Service/servicesEndpoint'}
getParameterFromStore(myFirstParam).then(console.log)
При кодировании в NodeJS, однако, я настоятельно рекомендую вместо этого использовать async / await , чтобы вы могли избежать Обетованного ада(chaninig Promise после Promise для достижения чего-то «синхронно»)
При использовании async / await вы можете создавать свой код, как если бы он был синхронным.Вот реорганизованная версия вашего примера с использованием функций async / await и стрелок:
const getParameterFromStore = param => {
return new Promise((resolve, reject) => {
console.log('++ ' + param.Path);
servmgr.getParametersByPath(param, (err, data) => {
if (err) {
console.log('Error getting parameter: ' + err, err.stack)
return reject(err);
}
return resolve(data);
});
})
}
exports.handler = async (event) => {
const endpointResult = await getParameterFromStore(event.someAttributeFromTheEventThatYouWantToUse)
console.log(endpointResult)
};
EDIT : после того, как OP исправил первую проблему, ясоздал рабочий пример самостоятельно.Оказалось, что способ, которым OP вызывал API, был неправильным.
Вот полный рабочий пример:
'use strict';
const AWS = require('aws-sdk')
AWS.config.update({
region: 'us-east-1'
})
const parameterStore = new AWS.SSM()
const getParam = param => {
return new Promise((res, rej) => {
parameterStore.getParameter({
Name: param
}, (err, data) => {
if (err) {
return rej(err)
}
return res(data)
})
})
}
module.exports.get = async (event, context) => {
const param = await getParam('MyTestParameter')
console.log(param);
return {
statusCode: 200,
body: JSON.stringify(param)
};
};
Помните атрибут Name
, который должен быть предоставлен как частьВызов API для метода ServiceManager.getAttribute.
Этот атрибут указан в официальных документах
Я сам выполнил это, и вот вывод в журналах CloudWatch:
Как видите, значение было успешно возвращено.
Надеюсь, это поможет!