javascript - 你可以在数据库中使用 "store"javascript,然后再执行它吗?

标签 javascript node.js

(作为内部应用程序,请将对安全性或其他方面的任何担忧抛诸脑后)

基本上我想做的是在数据库中存储一个 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/

相关文章:

javascript - 如何检测和删除 JavaScript 中的无效 unicode 序列

javascript - 访问下游早期 promise 中的变量

node.js - 错误 : EPERM: operation not permitted, 取消链接 'C:\wamp64\www\dev\node_modules\.staging'

node.js - 解析错误 : Cannot read file '.../tsconfig.json' . eslint

javascript - Reactjs 使用数组动态调用选项卡面板下有卡片的组件

javascript - 使用 HTML 将文件上传到 Node.js

javascript - ES6 类在 ExpressJS 中的行为不同?

javascript - 无效或意外的 token 'import' - jest/babel/webpack

javascript - 在 Google Chrome 的开发者工具上更改 JavaScript 文件

javascript - HTML5 Canvas : Replace Cursor with Crossing Lines