存储在MongoDB服务器中的“评估”功能

时间:2018-06-23 00:17:38

标签: 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数组格式显示。

但是我希望我的功能不带引号!您可以看到,简单地评估它是行不通的,因为在使用数组时,我仍然需要将其保留在准备好要执行的对象内部。

我该如何实现?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

最简单的方法是使用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。但是,再次确保这是绝对必要的,因为两者都被认为是不安全的,因为外部参与者基本上可以将代码注入到您的服务器中。