Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.JS-为什么等待不是等待_Javascript_Node.js_Amazon Web Services_Async Await - Fatal编程技术网

Javascript Node.JS-为什么等待不是等待

Javascript Node.JS-为什么等待不是等待,javascript,node.js,amazon-web-services,async-await,Javascript,Node.js,Amazon Web Services,Async Await,我正在AWS中使用lambda函数来做一些工作,我需要该函数从AWS SSM资源获取一些数据,以便完成这项工作。但是,我很难让代码等待对getParameter的调用,直到回调完成后再继续 我试着用两种不同的方式构造代码 这两种方式似乎都无法让执行暂停 我目前的实现是基于“结构参考#2”的,我不确定我做错了什么 const aws = require('aws-sdk'); const crypto = require('crypto'); const ssm = new aws.SSM()

我正在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”)
控制台日志(“键:+Key”)
控制台.log(数据)之前执行

更新日期:2019年7月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 = 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);
不直接返回
Promise
,它返回
AWS.Request
。您可以使用将请求作为承诺使用

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

    const key = data.Parameter.Value;
} catch (err) {
    console.log(err);
}

wait
只有在你等待承诺的时候才会做一些有用的事情。它没有让其他东西等待的魔力。您的函数似乎没有返回承诺,因此
await
不会执行任何操作。或者围绕接口包装您自己的承诺,并了解如何从您拥有的接口中获得承诺。Ref可以很好地使其成为序列化流。我对原始代码应用了wait和promise更改,密钥的log语句被触发了两次。你知道为什么会发生这种情况吗?log语句不应该触发多次,但是如果没有看到你的新代码,我不能肯定。我用新代码更新了帖子,添加了wait和promise。如果你使用promises,你不应该使用回调,AWS客户端可能会调用回调并解析承诺。为了使用try/catch,您应该省略回调,并使用
parameterRequest
变量中的数据。