Node.JS - Почему ждут не ждут - PullRequest
2 голосов
/ 02 июля 2019

Я использую лямбда-функцию в AWS, чтобы выполнить некоторую работу, и мне нужно, чтобы эта функция получила некоторые данные из ресурса AWS SSM, чтобы завершить работу. Однако я изо всех сил пытаюсь получить код для ожидания вызова на getParameter, чтобы дождаться завершения обратного вызова, прежде чем двигаться дальше.

Я пытался структурировать код двумя разными способами.

Структурная ссылка # 1

Структурная ссылка № 2

Кажется, что ни один из способов не заставляет выполнение остановиться.

С моей текущей реализацией, которая основана на "Структурной ссылке # 2", я не уверен, что делаю неправильно.

const aws = require('aws-sdk');
const crypto = require('crypto');
const ssm = new aws.SSM();

exports.handler = async (event, context, callback) => {

console.log(event.headers);

var webhook = JSON.parse(event.body);
var key = "";

var parameterRequest = ssm.getParameter( {
 Name: "param1",
 WithDecryption: true
}, function(err, data) {
    if (err)
    {
        console.log(err);    
    }
    else
    {
        key=data.Parameter.Value;    
        console.log(data);
    }
});

await parameterRequest;

var hash = crypto.createHmac('sha1', key).update(JSON.stringify(webhook)).digest('hex');
console.log("HASH: sha1=" + hash);
console.log("Key:" + key);
}

const response = {
        "statusCode": 200,
        "statusDescription": "200 OK"
    };
    return callback(null, response);

Почему console.log("HASH: sha1=" + hash); и console.log("Key:" + key); будут выполнены до console.log(data);?

Обновление 7/2/2019

Ожидание и обещание, примененные без улова попытки:

const aws = require('aws-sdk');
const crypto = require('crypto');
const ssm = new aws.SSM();

exports.handler = async (event, context, callback) => {

console.log(event.headers);

var webhook = JSON.parse(event.body);
var key = "";

var parameterRequest = await ssm.getParameter( {
 Name: "param1",
 WithDecryption: true
}, function(err, data) {
    if (err)
    {
        console.log(err);    
    }
    else
    {
        key=data.Parameter.Value;    
        console.log(data);
    }
}).promise();

var hash = crypto.createHmac('sha1', key).update(JSON.stringify(webhook)).digest('hex');
console.log("HASH: sha1=" + hash);
console.log("Key:" + key);
}

const response = {
        "statusCode": 200,
        "statusDescription": "200 OK"
    };
    return callback(null, response);

1 Ответ

3 голосов
/ 02 июля 2019

SSM.getParameter не возвращает Promise напрямую, возвращает AWS.Request. Вы можете использовать AWS.Request.promise(), чтобы использовать запрос в качестве обещания.

try {
    const data = await ssm.getParameter({
        Name: "param1",
        WithDecryption: true
    }).promise();
    console.log(data);

    const key = data.Parameter.Value;
} catch (err) {
    console.log(err);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...