【问题标题】:Node.JS - Why is await not waitingNode.JS - 为什么等待不等待
【发布时间】:2019-11-12 13:53:39
【问题描述】:

我在 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 日更新

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


【解决方案1】:

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

【讨论】:

  • 这很好地使它成为一个序列化的流程。我对原始代码应用了等待和承诺更改,并且密钥的日志语句被触发了两次。你知道为什么会这样吗?
  • 日志语句不应多次触发,但如果没有看到您的新代码,我无法确定。
  • 我通过添加 await 和 promise 用新代码更新了帖子。
  • 如果您正在使用 Promise,则不应使用回调,AWS 客户端可能会调用回调 AND 来解决 Promise。您应该省略回调以支持 try/catch 并使用来自 parameterRequest 变量的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2021-05-29
  • 2021-08-02
  • 2020-06-08
  • 1970-01-01
相关资源
最近更新 更多