AWS lambda功能带有两个回调



目前,我在node.js中执行lambda函数以获取我的AWS帐户的信息。当我想检索功能中所需的信息时,我有一个问题。我在控制台(Console.log(中看到了信息,但它在响应中不存在callback((。我总是得到第一个回调的回应,而不是第二回应。我已经阅读了异步过程,但我没有解决这个问题。您知道改进代码的变化是什么?

代码是下一个:

var AWS = require('aws-sdk');
var iam = new AWS.IAM();
var s3 = new AWS.S3();
exports.handler = (event, context, callback) => {
    var params1 = {};
 iam.listUsers(params1, function(err, data) {
   if (err)
    console.log(err, err.stack);
   else
    console.log(data);
    callback(null, data.Users);
 });
 var params2 = {};
 s3.listBuckets(params2, function(err, data) {
   if (err)
      console.log(err, err.stack);
   else
      console.log(data);
      callback(null, data.Buckets);
 });
};

预先感谢。

由于AWS Lambda现在支持节点8,因此可以在下面找到示例代码:

const AWS = require('aws-sdk');
const iam = new AWS.IAM();
const s3 = new AWS.S3();
async function stackoverflow() {
 let params1 = {};
 let params2 = {};
 try {
  // synchronously call each method and store resolved promises. 
  let results1 = await iam.listUsers(params1).promise();
  let results2 = await s3.listBuckets(params2).promise();
  console.log(results1);
  console.log(results2);
 }
 catch(e) {
  console.error(e);
 }
}
exports.handler = (event, context, callback) => {
  stackoverflow();
};

这是异步库或Promise的理想情况。我将在不使用手机的情况下稍后尝试制作代码示例,但是从本质上讲,它们都可以让您执行几个异步功能,然后进行一个回调。

使用Promise.All,您可以做这样的事情:

const AWS = require("aws-sdk");
const iam = new AWS.IAM({apiVersion: "2010-05-08"});
const s3 = new AWS.S3({apiVersion: "2006-03-01"});
exports.handler = (event, context, callback) => {
    const iamParams = {};
    const s3Params = {};
    const promises = [listUsers(iamParams), listBuckets(s3Params)];
    // NOTE: If any of the passed-in promises reject, `Promise.all` asynchronously
    // rejects with the value of the promise that rejected,
    // whether or not the other promises have resolved.
    Promise.all(promises)
        .then(([users, buckets]) => {
            // console.log(users);
            // console.log(buckets);
            callback(null, {
                Users: users,
                Buckets: buckets
            });
        })
        .catch((err) => {
            callback(err);
        });
};
function listUsers(params) {
    return new Promise((resolve, reject) => {
        iam.listUsers(params, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data.Users);
            }
        });
    });
}
function listBuckets(params) {
    return new Promise((resolve, reject) => {
        s3.listBuckets(params, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data.Buckets);
            }
        });
    });
}

最新更新