在节点服务器中使用eval是个坏主意吗?

时间:2017-09-25 10:45:34

标签: node.js eval

我想在节点中动态创建一个对象。为此,我使用了这样的代码。 在节点服务器中使用eval是个坏主意吗?

var a1 = require(./a1.js),
    a2 = require(./a2.js),
    ...
    aN = require(./aN.js);

    function createObj(pObjName, pObjValue){
        var tmp = new eval(pObjName)(pObjValue);
        //where pObjName is a1 or a1 or .... or aN
    }

3 个答案:

答案 0 :(得分:3)

根据您展示的内容,无需使用eval

const Classes = {
  a1 : require('./a1'),
  a2 : require('./a2'),
  ...
};

function createObj(pObjName, pObjValue){
  var tmp = new Classes[pObjName](pObjValue);
  ...
}

答案 1 :(得分:1)

好像你想用一组属性创建对象?

您可能需要查看Object.create()-method

答案 2 :(得分:0)

如果你想节省宣布所有这些依赖项的时间,你甚至可以编写一个函数而不使用eval来更有效地处理案例:

function createObj(pObjName, pObjValue) {
  var tmp = new (require('./' + pObjName))(pObjValue);
  // ...
}

请注意,只有在createObj()保证使用您所期望的pObjName调用时,这才是安全的,否则您需要先验证它,可能是这样的:< / p>

function createObj(pObjName, pObjValue) {
  if (!/^a\d$/.test(pObjName)) {
    throw new TypeError('invalid name')
  }

  var tmp = new (require('./' + pObjName))(pObjValue);
  // ...
}