[英]Share code between AWS lambda functions in node.js
似乎不可能在另一個 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)
?
從 AWS Reinvent 2018 開始,亞馬遜推出了Lambda 層。
Lambda 層,一種集中管理跨多個函數共享的代碼和數據的方法。
這個想法是,現在您可以將常用組件放在 ZIP 文件中並將其作為 Lambda 層上傳。 您的函數代碼不需要更改,並且可以像通常那樣引用層中的庫,而不是將它們單獨打包。
請參閱有關使用回調參數的文檔:
它說明了result
(代碼中的callbackPayload
):
result – 是一個可選參數,可用於提供成功執行函數的結果。 提供的結果必須與
JSON.stringify
兼容。 如果提供了錯誤,則忽略此參數。
要與JSON.stringify
兼容,您不能在那里使用任何函數。 請參閱http://json.org/以查看什么是有效的 JSON(僅限字符串、數字、對象、數組、 true
、 false
和null
)。
如果您想在廣義上的 AWS Lambda 函數之間共享代碼,則require
在它們中使用相同的 Node 模塊,以便您可以為所有 AWS Lamda 處理程序提供一組通用函數。 但是您不能在它們之間傳遞任意代碼,因為它們不會在JSON.stringify
幸存下來。
作為測試,您可以嘗試在瀏覽器中運行它:
var callbackPayload = {};
callbackPayload.fooData = 'fooFromData';
callbackPayload.fooFunction = function() {return 'fooFromFunction'; };
alert(JSON.stringify(callbackPayload));
(參見DEMO )或 Node 中的這個:
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
,但我不會真正推薦它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.