簡體   English   中英

在 node.js 中的 AWS lambda 函數之間共享代碼

[英]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(僅限字符串、數字、對象、數組、 truefalsenull )。

如果您想在廣義上的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM