在node.js中的AWS lambda函数之间共享代码

时间:2016-06-21 11:42:20

标签: node.js amazon-web-services callback aws-lambda

似乎无法传递在另一个AWS lambda函数中作为AWS lambda函数调用的某些代码(包含数据和函数)。

例如,请使用此customConfigLambda

var callbackPayload = {};

callbackPayload.fooData = 'fooFromData';
callbackPayload.fooFunction = function() {return 'fooFromFunction'; };

exports.handler = (event, context, callback) => {
    callback(null, callbackPayload);
};

当我在另一个AWS lambda函数中调用之前的AWS lambda函数时,如下所示:

var AWS = require('aws-sdk');
AWS.config.update({accessKey: '123', secretAccessKey: 'abc', region: 'us-east-1' });
var lambda = new AWS.Lambda({region: 'us-east-1'});

exports.handler = (event, context, callback) => {
    var params = {FunctionName: 'customConfigLambda'};
    lambda.invoke(params, function(err, callbackPayload) {
        if (err) {
            // do nothing
        }
        else {
            console.log('callbackPayload:', JSON.stringify(callbackPayload, null, 2));
        }
    });
};

然后,我只能看到callbackPayload.fooData而不是callbackPayload.fooFunction

如何在多个其他AWS lambda函数之间共享一些callbackPayload.fooFunction(s)

2 个答案:

答案 0 :(得分:1)

请参阅有关使用回调参数的文档:

它说明了callbackPayload(代码中的JSON.stringify):

  

result - 是一个可选参数,可用于提供   功能执行成功的结果。提供的结果必须是   JSON.stringify兼容。如果提供了错误,则此参数为   忽略。

true兼容,你不能拥有任何功能。请参阅http://json.org/以了解哪些是有效的JSON(仅限字符串,数字,对象,数组,falsenullrequire。)

如果您希望在广义上在AWS Lambda函数之间共享代码,则必须在JSON.stringify中同时使用相同的Node模块,以便您可以为所有这些功能提供一组通用功能。您的AWS Lamda处理程序。但是你不能在它们之间传递任意代码,因为它们不会在var callbackPayload = {}; callbackPayload.fooData = 'fooFromData'; callbackPayload.fooFunction = function() {return 'fooFromFunction'; }; alert(JSON.stringify(callbackPayload)); 之后存在。

作为测试,您可以尝试在浏览器中运行它:

var callbackPayload = {};

callbackPayload.fooData = 'fooFromData';
callbackPayload.fooFunction = function() {return 'fooFromFunction'; };

console.log(JSON.stringify(callbackPayload));

(见DEMO) 或节点中的这个:

{"fooData":"fooFromData"}

并查看结果:

callbackPayload.fooFunction
    = function() {return 'fooFromFunction'; }.toString();

在序列化过程中删除了这些函数。

当然你可以这样做:

{"fooData":"fooFromData","fooFunction":"function () {return 'fooFromFunction'; }"}

并获得JSON结果:

eval

你理论上可以global $user; $items = array(); $sql = 'SELECT nid FROM {node} WHERE uid = :uid'; $result = db_query($sql, array(':uid' => $user->uid)); foreach ($result as $row) { $items[] = $row->nid; } dsm($items); 在另一端,但我不会真的推荐它。

答案 1 :(得分:0)

从AWS Reinvent 2018开始,Amazon引入了Lambda Layers

  

Lambda层,一种集中管理跨多个功能共享的代码和数据的方法。

这个想法是,现在您可以将常用组件放在ZIP文件中,并将其作为Lambda图层上传。您的功能代码无需更改,可以照常引用层中的库,而不必单独打包。