Node.JS-为什么不等待

时间:2019-07-01 23:30:41

标签: javascript node.js amazon-web-services async-await

我在AWS中使用lambda函数来完成一些工作,并且我需要该函数从AWS SSM资源中​​获取一些数据才能完成工作。但是,我一直在努力让代码等待对getParameter的调用才能等到回调完成后再继续。

我尝试用两种不同的方式来构造代码。

Structure reference #1

Structure reference #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 个答案:

答案 0 :(得分:3)

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);
}