首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存储和检索存储在JavaScript文档中的MongoDB函数?

问如何存储和检索存储在JavaScript文档中的MongoDB函数?
EN

Stack Overflow用户
提问于 2018-01-30 06:16:30
回答 1查看 1K关注 0票数 1

我有一个包含评分函数的文档的“赋值”MongoDB集合。我希望将这个评分函数存储在赋值文档中,因为随着新作业的创建,评分逻辑可能会随着时间的推移而改变:

分配

代码语言:javascript
复制
{
  _id: "assignment1",
  question: "Number between 1 and 10",
  scoringFunction: function (value) { value * 2 }
}

当用户完成分配时,将在"Events“集合中插入一个新文档:

事件

代码语言:javascript
复制
{
  _id: "event1",
  answer: "4",
  score: "8"
}

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

一些调试代码:

代码语言:javascript
复制
const assignment = Assignments.findOne({ _id: "test" })
console.log(assignment.scoringFunction)

调试代码输出:

代码语言:javascript
复制
Code {
  _bsontype: 'Code',
  code: 'function (value) { value * 2 }',
  scope: undefined
}

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

EN

回答 1

Stack Overflow用户

发布于 2018-01-31 00:23:20

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

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

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

已实现的解决方案

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

分配

代码语言:javascript
复制
{
  _id: "assignment1",
  question: "Number between 1 and 10",
  scoringFunction: "scoreAssignment1"
}

流星逻辑

代码语言:javascript
复制
const scoreAssignment1 = (value) => value * 2
const assignment = Assignments.findOne({ _id: "test"})
console.log(Meteor.call(assignment.scoringFunction, 2))    
// output: 4

危险溶液

将scoringFunction的主体存储在字符串中,然后使用new Function()根据所需的参数和函数体字符串创建函数。

分配

代码语言:javascript
复制
{
  _id: "assignment1",
  question: "Number between 1 and 10",
  scoringFunction: "value * 2"
}

事件逻辑

代码语言:javascript
复制
const assignment = Assignments.findOne({ _id: "test"})
const scoringFunction = new Function('value', assignment.scoringFunction)
console.log(scoringFunction(2))
// output: 4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48515027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档