javascript - Node.JS - 为什么await不等待

标签 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);?

2019 年 7 月 2 日更新

在没有 try catch 的情况下应用 Await 和 Promise:

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

最佳答案

SSM.getParameter不直接返回 Promise,而是返回 AWS.Request。您可以使用AWS.Request.promise()将请求作为 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);
}

关于javascript - Node.JS - 为什么await不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56843610/

相关文章:

git - 从 git 转换为 gitolite : do I change the repo's url?

c# - 从在已分配 IAM 角色的 Amazon EC2 实例上运行的 C# .NET 应用程序为联合用户创建 STS token

javascript - wrapAll() 只处理第一个元素?

javascript - 伊宏。如何保存多张属性变化的图像?

mysql - 我的网站 node.js 索引和 mysql 之间的连接不起作用

mysql - 带有 MySQL docker 容器网络设置的 Node.js

node.js - 使用 Node.js 的 Nginx 配置

javascript - 为什么 [Array] 中的 [].constructor 返回 false

javascript - 有没有办法动态更改JavaScript中选择标签的值和显示?

amazon-web-services - 使用 CLI 使 S3 存储桶权限公开访问 'Everyone'