(作为内部应用程序,请将对安全性或其他方面的任何担忧抛诸脑后)
基本上我想做的是在数据库中存储一个 javascript 函数:
function x(name) {
return name + 1;
}
然后稍后获取数据库行
(这里是伪代码)
x = db.get('function').where('id').equals(1);
console.log(x('bob'));
//should print "bob +1 "
这是我设想的场景:
基本上,我得到一个 JSON 对象,根据特定条件,我想对该 json 进行一些转换,并输出新的转换后的 json。为了“主”应用程序,我不想硬编码转换逻辑,而是动态的(动态的,不同的开发人员将在运行时提供它)
所以一个数据库可能包含:
ID | javascript
====================
1 | (some js code)
2 | (same func, different code)
我想做的是使用我选择的输入执行存储在数据库中的 JS 代码。
如果它更容易,函数名称将是标准的..即我们可以假设保存在数据库中的 javascript 将全部遵循:
function transform(input) {
/* below this line logic will change
* end diff logic/
return output
}
最佳答案
您可以使用 eval()
function 执行任意 JS 字符串,这将返回任何评估的结果。
因此,出于您的目的,如果您想分配一个变量来保存字符串中的(已求值的)函数,您可以这样做:
// retrieve string from DB somehow
var functionString = "(function whatever(name) { return name + 1; })";
var x = eval(functionString);
console.log(x("bob")); // logs "bob1"
请注意,我已将函数包含在括号中的字符串中,因为这使它成为一个函数表达式,然后可以将其分配给变量 x
。
I dont want to hard code the transformation logic, instead it will be dynamic (dynamic in the sense that a different developer will provide it at run time)
另一种方法,在我看来是一种更好的方法,是将所有转换函数放入一个单独的 JavaScript 模块中,然后根据标准 Node.js module loading system require()
.这样,转换逻辑在另一个文件中保持独立,该文件可以根据需要由不同的开发人员单独维护,而无需处理数据库操作和 eval()
:
// transforms.js
module.exports = {
"1" : function plus1(name) { return name + 1; },
"2" : function square(x) { return x * x; },
"3" : function half(x) { return x / 2; }
// etc.
};
// in main JS file
var transforms = require("./transforms.js");
var a = transforms["2"];
var b = transforms["3"];
console.log(a(b(20))); // 100
console.log(transforms["1"]("bob")); // "bob1"
正如您在上面看到的,每个“动态”转换函数都被定义为对象的一个属性,其中属性名称是您要在数据库中使用的键。
StackOverflow 代码片段似乎无法处理模块,但如果您展开以下代码片段,您可以看到与上述代码等效的代码:
// in "transform.js"
var transforms = {
"1" : function plus1(name) { return name + 1; },
"2" : function square(x) { return x * x; },
"3" : function half(x) { return x / 2; }
// etc.
};
// in main JS file
var a = transforms ["2"];
var b = transforms ["3"];
console.log(a(b(20))); // 100
console.log(transforms ["1"]("bob")); // "bob1"
关于javascript - 你可以在数据库中使用 "store"javascript,然后再执行它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38548039/