【问题标题】:How to store and retrieve JavaScript function stored in MongoDB document?如何存储和检索存储在 MongoDB 文档中的 JavaScript 函数?
【发布时间】:2018-01-31 08:23:20
【问题描述】:

我有一个“作业”MongoDB 集合,其中包含包含评分函数的文档。我想将此评分函数存储在作业文档中,因为随着新作业的创建,评分逻辑可能会随时间而变化:

作业

{
  _id: "assignment1",
  question: "Number between 1 and 10",
  scoringFunction: function (value) { value * 2 }
}

当用户完成分配时,将插入“事件”集合中的新文档:

事件

{
  _id: "event1",
  answer: "4",
  score: "8"
}

我可以将上面的 Assignment 文档插入到我的 Assignments 集合中,但是当我尝试检索 scoringFunction 时,它不再是一个函数,而是一个对象。

一些调试代码:

const assignment = Assignments.findOne({ _id: "test" })
console.log(assignment.scoringFunction)

调试代码输出:

Code {
  _bsontype: 'Code',
  code: 'function (value) { value * 2 }',
  scope: undefined
}

如何将此对象解码回一个 JavaScript 函数,该函数可以通过参数调用以计算分数?

【问题讨论】:

标签: javascript mongodb meteor


【解决方案1】:

警告:避免将执行的代码与数据一起存储。

从数据安全的角度来看,理想情况下,不要在数据中存储可执行代码。

如果黑客(或用户)能够在您的数据库中更改此函数,如果该函数无法正常工作,他们可能会破坏您的数据或破坏您的应用程序。


实施的解决方案

我要将评分函数的名称存储在作业中。

作业

{
  _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: 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多