2017-09-25 14 views
0

Je souhaite créer un objet dynamiquement dans un noeud. Pour ce faire, j'ai utilisé un code comme celui-ci. Cette utilisation d'eval dans un serveur de noeud est-elle une mauvaise idée?cette utilisation d'eval dans un serveur de noeud est-elle une mauvaise idée?

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 
    } 
+2

Il est difficile de deviner ce que vous voulez atteindre, mais il est très probable qu'il existe de meilleurs moyens de le faire. –

Répondre

2

D'après ce que vous montrez, il n'y a pas besoin d'utiliser eval:

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

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

Même 'new (require ('./' + pObjName)) (pObjValue)' suffirait, car les dépendances résolues sont mémorisées et les appels consécutifs n'ont pas de surcharge supplémentaire. –

+1

@PatrickRoberts ouais ce serait une autre bonne solution :) (bien que cela dépend de l'endroit où 'pObjName' vient, il faudra peut-être d'abord l'assainir) – robertklep

+0

J'avais pensé à cette alternative. Puisque vous me suggérez aussi, j'adopterai cette solution. Merci –

0

Si vous voulez vous épargner le temps de déclarer tous les dépendances, vous pouvez même écrire une fonction sans utiliser eval qui gère le cas encore plus efficace:

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

S'il vous plaît noter que ce n'est sûr que si createObj() est garanti d'être invoqué par un pObjName qui est ce que vous attendez, sinon vous devrez valider d'abord, peut-être quelque chose comme ceci:

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

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