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

Node.js 在节点服务器中使用eval是个坏主意吗?,node.js,eval,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 p

我想在节点中动态创建一个对象。为此,我使用了这样的代码。 在节点服务器中使用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
    }

似乎要创建具有一组属性的对象


您可能需要查看一下

是否希望创建具有一组属性的对象


您可能想从显示的内容中查看

,无需使用
eval

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

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

从您所展示的内容来看,无需使用
eval

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

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

如果您想节省声明所有这些依赖项的时间,您甚至可以编写一个函数,而无需使用
eval
,这样可以更有效地处理这种情况:

function createObj(pObjName, pObjValue) {
  var tmp = new (require('./' + pObjName))(pObjValue);
  // ...
}
请注意,只有当
createObj()
被保证使用
pObjName
调用时,这才是安全的,这正是您所期望的,否则您需要首先验证它,可能类似这样:

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

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

如果您想节省声明所有这些依赖项的时间,您甚至可以编写一个函数,而无需使用
eval
,这样可以更有效地处理这种情况:

function createObj(pObjName, pObjValue) {
  var tmp = new (require('./' + pObjName))(pObjValue);
  // ...
}
请注意,只有当
createObj()
被保证使用
pObjName
调用时,这才是安全的,这正是您所期望的,否则您需要首先验证它,可能类似这样:

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

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

很难猜测你想要实现什么,但很可能有更好的方法。很难猜测你想要实现什么,但很可能有更好的方法。即使是
new(require('./'+pObjName))(pObjValue)
也足够了,由于已解析的依赖项会被记录,连续调用不会有任何额外开销。@PatrickRoberts是的,这将是另一个很好的解决方案:)(尽管取决于
pObjName
的来源,可能需要先对其进行清理)我已经想到了这个替代方案。既然你也建议我,我就采用这个解决方案。ThanksEven
new(require('./'+pObjName))(pObjValue)
就足够了,因为已解析的依赖项会被记录,连续调用不会有任何额外开销。@PatrickRoberts是的,这将是另一个很好的解决方案:)(尽管根据
pObjName
的来源,可能需要先对其进行清理)我已经想到了这个选择。既然你也建议我,我就采用这个解决方案。谢谢