6

我正在尝试通过 AWS Lambda 从现有应用程序运行特定函数,使用 JS SDK 从我的 node.js 应用程序调用 Lambda。由于我要覆盖现有函数,因此我必须保留其基本结构,即:

overwrittenFunction = function(params) {
    //get some data
    return dataArray;
}

..所以我需要一个可以返回的数组,如果我想保持我使用的lib的底层结构相同。现在据我所知,Lambda 调用是异步的,因此不可能做这样的事情:

overwrittenFunction = function(params) {
    lambda.invoke(params, callback);
    function callback(err,data) {
        var dataArray = data;
    }
    return dataArray;
}

(我也用 promises 和 async/await 尝试过类似的事情)。

afaik 我现在有两个选择:以某种方式弄清楚如何进行同步 Lambda 调用,或者修改我的库/现有应用程序(如果可能的话,我宁愿不这样做)。

有没有办法做这样的事情并以某种方式返回我期望的值?

(我正在使用节点 v8.9.4)

4

2 回答 2

22

Lambda 和 async/await 有点棘手,但以下对我有用(在生产中):

const lambdaParams = {
    FunctionName: 'my-lambda',
    // RequestResponse is important here. Without it we won't get the result Payload
    InvocationType: 'RequestResponse',
    LogType: 'Tail', // other option is 'None'
    Payload: {
        something: 'anything'
    }
};

// Lambda expects the Payload to be stringified JSON
lambdaParams.Payload = JSON.stringify(lambdaParams.Payload);

const lambdaResult = await lambda.invoke(lambdaParams).promise();

logger.debug('Lambda completed, result: ', lambdaResult.Payload);

const resultObject = JSON.parse(lambdaResult.Payload)

用try/catch把它包起来,然后去城里。

于 2018-06-20T01:00:14.370 回答
5

您可以使用异步等待,但由于 AWS 开发工具包使用节点回调模式,您需要使用内置的 promisify 包装函数。

const promisify = require('utils').promisify 
const aws = require('aws-sdk');

const lambda = aws.Lambda();
const invoke = promisify(lambda.invoke);

async function invocation(params) {
  try {
    return await invoke(params);
  } catch (err) {
    throw new Error('Somethings up');
  }
}

const data = invocation(params);
于 2018-01-17T16:41:44.017 回答