在node.js中的AWS lambda函数之间共享代码
问题描述:
似乎不可能传递一些在另一个AWS lambda函数中作为AWS lambda函数调用的代码(包含数据和函数)。在node.js中的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)
?
答
有关使用回调参数的文档:
它说这对result
(在代码中callbackPayload
):
结果 - 被一个可选参数,您可以使用该参数提供成功执行功能的 结果。所提供的结果必须是
JSON.stringify
兼容。如果提供了错误,则忽略此参数 。
要成为JSON.stringify
兼容,您不能在那里有任何功能。请参阅http://json.org/以查看什么是有效的JSON(仅限字符串,数字,对象,数组,true
,false
和null
)。
如果你想在广义上您的AWS lambda函数之间共享代码,你必须require
在二者的同一节点模块,这样您就可以将一组通用的功能,所有AWS的Lamda的处理程序。但是你不能绕过它们之间的任意代码,因为这些代码将无法在JSON.stringify
中生存。
作为一个测试,你可以尝试在浏览器中运行以下命令:
var callbackPayload = {};
callbackPayload.fooData = 'fooFromData';
callbackPayload.fooFunction = function() {return 'fooFromFunction'; };
alert(JSON.stringify(callbackPayload));
(见DEMO) 或这节点:
var callbackPayload = {};
callbackPayload.fooData = 'fooFromData';
callbackPayload.fooFunction = function() {return 'fooFromFunction'; };
console.log(JSON.stringify(callbackPayload));
和看到的结果是:
{"fooData":"fooFromData"}
在序列化过程中,这些功能被剥离出来。
当然,你可以做这样的事情:
callbackPayload.fooFunction
= function() {return 'fooFromFunction'; }.toString();
,并得到一个JSON结果:
{"fooData":"fooFromData","fooFunction":"function() {return 'fooFromFunction'; }"}
,你可以在另一端理论上eval
但我真的不能推荐它。
谢谢,我希望有一种方法:)关于'需要'在不同的lambda函数中定制模块是否有涉及普通代码(即没有ZIP/S3文件上传)的方式?关于'eval',我猜只有当函数没有输入参数时才能工作。 – TPPZ
@TPPZ您可以看看无服务器项目(以前称为JAWS) - 请参阅此信息:http://docs.serverless.com/docs/installing-serverless它可以帮助您很多部署许多共享的功能一些常见的代码库。至于评估函数,你可以评估一个字符串'“函数(x){return x;}”',并且eval的结果将是一个可以使用参数运行的函数。我不推荐它,因为它会变得混乱 - 例如,函数中的符号无法访问它所在的原始范围,而是它所在的范围。 – rsp
好的,谢谢你的链接和细节。为了完整起见,可以这样做:'var fooFunctionParsed = eval('('+ callbackPayload.fooFunction +')');'然后像'const inputX = 42; const outputX = fooFunctionParsed(inputX);'。我没有调查过像'this'这样的示波器,但是对于简单的帮助器/化妆品功能,返回输入参数的组合,'eval'似乎是最快的解决方案。 – TPPZ