开发者问题收集

AWS Lambda 执行动态代码

2017-10-30
1965

是否可以定义一个 NodeJs 函数来评估动态 nodejs 代码?

这是上下文:

用户创建自定义 javascript 函数,该函数应返回 true / false。

我需要在运行在 NodeJs 上的 AWS Lambda 容器中“评估”用户代码。

可能吗?

我应该使用类似于 javascript eval 函数的东西吗?

编辑

这是我尝试过的

'use strict';

exports.handler = (event, context, callback) => {
    var body = "function test() { return 10; };";
    console.log("body", body);

    eval(body);

    var result = test();

    callback(null, result);
};

我收到一条错误消息,提示“test”未定义,因此 eval 未得到正确评估。

START RequestId: 6e9abd93-bd69-11e7-a43f-c75328d778e1 Version: $LATEST
2017-10-30T11:56:58.569Z    6e9abd93-bd69-11e7-a43f-c75328d778e1    body function test() { return 10; };
2017-10-30T11:56:58.581Z    6e9abd93-bd69-11e7-a43f-c75328d778e1    ReferenceError: test is not defined
    at exports.handler (/var/task/index.js:11:18)
END RequestId: 6e9abd93-bd69-11e7-a43f-c75328d778e1
REPORT RequestId: 6e9abd93-bd69-11e7-a43f-c75328d778e1  Duration: 32.78 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 19 MB  
RequestId: 6e9abd93-bd69-11e7-a43f-c75328d778e1 Process exited before completing request
2个回答

eval 在 Lambda 中运行良好。删除 'use strict' 即可正常运行,输出 10。

严格模式不允许创建全局变量,这就是您收到错误的原因。

第二种选择是明确将函数添加到全局上下文中:

'use strict';

exports.handler = (event, context, callback) => {
    var body = "global.test = function() { return 10; };";
    console.log("body", body);

    eval(body);

    var result = test();

    callback(null, result);
};
2017-11-02

Node 只是一个在服务器端执行 javascript 的运行时。您可以在 Node(Lambda)内部编写任何有效的 Javascript 代码。

正如我在代码中看到的那样,“eval”没有执行,您可以尝试安装包“npm install eval” - https://www.npmjs.com/package/eval

Vijayanath Viswanathan
2017-10-30