【发布时间】:2019-11-12 13:53:39
【问题描述】:
我在 AWS 中使用 lambda 函数来完成一些工作,我需要该函数从 AWS SSM 资源中获取一些数据才能完成工作。但是,我正在努力让代码等待对 getParameter 的调用,以等待回调完成后再继续。
我尝试以两种不同的方式构建代码。
这两种方法似乎都无法让执行暂停。
我当前的实现是基于“结构参考 #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 日更新
Await 和 Promise 在没有 try catch 的情况下应用:
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);
【问题讨论】:
-
await仅在您等待承诺时才做一些有用的事情。它没有让其他东西等待的魔力。您的函数似乎没有返回承诺,所以await没有做任何事情。要么将你自己的 Promise 包裹在接口周围,然后找出如何从你拥有的接口中获取 Promise。
标签: javascript node.js amazon-web-services async-await