我有一个包含评分函数的文档的“赋值”MongoDB集合。我希望将这个评分函数存储在赋值文档中,因为随着新作业的创建,评分逻辑可能会随着时间的推移而改变:
分配
{
_id: "assignment1",
question: "Number between 1 and 10",
scoringFunction: function (value) { value * 2 }
}当用户完成分配时,将在"Events“集合中插入一个新文档:
事件
{
_id: "event1",
answer: "4",
score: "8"
}我可以将上面的赋值文档插入到我的赋值集合中,但是当我试图检索scoringFunction时,它不再是一个函数,而是一个对象。
一些调试代码:
const assignment = Assignments.findOne({ _id: "test" })
console.log(assignment.scoringFunction)调试代码输出:
Code {
_bsontype: 'Code',
code: 'function (value) { value * 2 }',
scope: undefined
}我如何将这个对象解码回一个JavaScript函数,该函数可以用参数调用来计算分数?
发布于 2018-01-31 00:23:20
警告:避免将已执行的代码与数据一起存储。
理想情况下--从数据安全的角度--不要在数据中存储可执行代码。
如果黑客(或用户)能够在数据库中更改此功能,如果该功能不能正常工作,他们可能会破坏您的数据或破坏您的应用程序。
已实现的解决方案
我将在作业中存储评分函数的名称。
分配
{
_id: "assignment1",
question: "Number between 1 and 10",
scoringFunction: "scoreAssignment1"
}流星逻辑
const scoreAssignment1 = (value) => value * 2
const assignment = Assignments.findOne({ _id: "test"})
console.log(Meteor.call(assignment.scoringFunction, 2))
// output: 4危险溶液
将scoringFunction的主体存储在字符串中,然后使用new Function()根据所需的参数和函数体字符串创建函数。
分配
{
_id: "assignment1",
question: "Number between 1 and 10",
scoringFunction: "value * 2"
}事件逻辑
const assignment = Assignments.findOne({ _id: "test"})
const scoringFunction = new Function('value', assignment.scoringFunction)
console.log(scoringFunction(2))
// output: 4https://stackoverflow.com/questions/48515027
复制相似问题