javascript - "Evaluate"存储在MongoDB服务器中的函数

标签 javascript node.js mongodb server client

我的收藏看起来像这样:

> db.projects_columns.find()
{ "_id" : "5b28866a13311e44a82e4b8d", "checkbox" : true }
{ "_id" : "5b28866a13311e44a82e4b8e", "field" : "_id", "title" : "ID", "sortable" : true }
{ "_id" : "5b28866a13311e44a82e4b8f", "field" : "Project", "title" : "Project", "editable" : { "title" : "Project", "placeholder" : "Project" } }
{ "_id" : "5b28866a13311e44a82e4b90", "field" : "Owner", "title" : "Owner", "editable" : { "title" : "Owner", "placeholder" : "Owner" } }
{ "_id" : "5b28866a13311e44a82e4b91", "field" : "Name #1", "title" : "Name #1", "editable" : { "title" : "Name #1", "placeholder" : "Name #1" } }
{ "_id" : "5b28866a13311e44a82e4b92", "field" : "Name #2", "title" : "Name #2", "editable" : { "title" : "Name #2", "placeholder" : "Name #2" } }
{ "_id" : "5b28866a13311e44a82e4b93", "field" : "Status", "title" : "Status", "editable" : { "title" : "Status", "type" : "select", "source" : [ { "value" : "", "text" : "Not Selected" }, { "value" : "Not Started", "text" : "Not Started" }, { "value" : "WIP", "text" : "WIP" }, { "value" : "Completed", "text" : "Completed" } ], "display" : "function (value, sourceData) { var colors     = { 0: 'Gray', 1: '#E67C73', 2: '#F6B86B', 3: '#57BB8A' }; var status_ele = $.grep(sourceData, function(ele){ return ele.value == value; });  $(this).text(status_ele[0].text).css('color', colors[value]); }", "showbuttons" : false } }

您可以看到,在最后一个文档中,我将一个函数存储为文本。现在的想法是,我将请求此数据,并将采用 Javascript 数组格式。

但我希望能够在没有引号的情况下实现我的功能!您可以看到,简单地评估它是行不通的,因为我需要让它仍然需要位于对象内部,以便在使用数组时准备好执行。

我怎样才能实现这个目标?

感谢您的帮助!

最佳答案

有两种可能的解决方案,但都不是特别安全,您应该首先认真考虑为什么需要将函数存储为字符串。话虽这么说,你可以做两件事。

最简单的是使用eval 。为此,您必须首先像平常一样解析对象,然后将所需的属性设置为对函数字符串进行评估的结果,如下所示:

// Pass in whatever JSON you want to parse
var myObject = JSON.parse(myJSONString);
// Converts the string to a function
myObject.display = eval("(" + myObject.display + ")");
// Call the function with whatever parameters you want
myObject.display(param1, param2);

额外的括号是为了确保评估正确进行。请注意,Mozilla 认为这不安全,并且明确建议不要使用 eval。

第二个选项是使用 Function构造函数。为此,您需要重组数据,以便单独存储参数,这样您就可以执行如下操作:

var myObject = JSON.parse(myJSONString);
// displayParam1 and displayParam2 are the stored names of your parameters for the function
myObject.display = Function(myObject.displayParam1, myObject.displayParam2, myObject.display)

这个方法肯定需要更多的修改,所以如果你想使用现有的结构,我推荐 eval。然而,再次确保这是绝对必要的,因为两者都被认为是不安全的,因为外部参与者基本上可以将代码注入(inject)到您的服务器中。

关于javascript - "Evaluate"存储在MongoDB服务器中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50996907/

相关文章:

c# - .net mongodb 2.2版本超时异常

node.js - 配置 mongodb node.js 驱动程序以使用 snappy 压缩

javascript - 图像映射中的纯 CSS 数据工具提示(jquery?)

javascript - 如何将我的函数应用于多个元素?

javascript - node.js http 模块的 "req.url"的 express.js 等价物是什么?

mongodb - 递归查询?

javascript - 使用 anchor 标记时出现 "jumping"问题

javascript - 如何在CKEditor5中设置选择?

node.js - 是否有与 Express 中的 rake 任务类似的东西?

javascript - Node : Memory usage grows during recursive scrape until crash