首页 > 解决方案 > 加载存储在数据库中的 javascript 类

问题描述

我有一个使用 webpack 的反应应用程序。在我的应用程序中,我允许用户用他们自己的自定义行为覆盖默认行为。

例如,假设应用程序有一个按钮,当单击该按钮时会向用户发出一条消息,并且该用户宁愿不被警告框惹恼,他们宁愿它是一个 console.log 语句。在管理控制台中,他们将上传一个类,该类必须有一个名为 exec() 的方法。然后他们将单击按钮(在管理控制台中)并将其 onClick 功能更改为他们自定义类的名称。

目前,当他们上传文件时,在检查以确保它是具有 exec 方法的有效 js 类之后,该类作为文本存储在数据库中。

我想要的是,当应用程序启动时,应用程序会读取所有类并将它们存储为映射,并以它们的名称作为键。我可以从数据库中检索类(作为文本)我怎样才能把它变成一个对象?

编辑添加的代码这里是一个示例类

class CustomClass {

  exec(params) {
  console.log('you are in a custom class');
 }
}

获取自定义类

 const apiUrl = 'https://api.example.com/customClasses';
    fetch(apiUrl)
      .then((response) => response.json())
      .then((data) => console.log(data));

这将给出一个看起来像的 json

{
    "CustomClass":  "class CustomClass {\r\n\r\n  exec(params) {\r\n  console.log(\"you are in a custom class\");\r\n }\r\n}",
    "CustomClass2":  "class CustomClass2 {\r\n\r\n  exec(params) {\r\n  console.log(\"you are in a custom class2\");\r\n }\r\n}"    
}

标签: javascriptnode.js

解决方案


所以,事实证明你可以使用eval括号,如此处所示

let userClasses = {
    "CustomClass":  "class CustomClass {\r\n\r\n  exec(params) {\r\n  console.log(\"you are in a custom class\");\r\n }\r\n}",
    "CustomClass2":  "class CustomClass2 {\r\n\r\n  exec(params) {\r\n  console.log(\"you are in a custom class2\");\r\n }\r\n}"    
}

for (const userClassName in userClasses) {
    const userClass = eval(`(${userClasses[userClassName]})`);
    let userClassObject = new userClass();
    userClassObject.exec();
}

这会解决你的问题吗?


推荐阅读