Node.js 在节点服务器中使用eval是个坏主意吗?
我想在节点中动态创建一个对象。为此,我使用了这样的代码。 在节点服务器中使用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
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
的来源,可能需要先对其进行清理)我已经想到了这个替代方案。既然你也建议我,我就采用这个解决方案。ThanksEvennew(require('./'+pObjName))(pObjValue)
就足够了,因为已解析的依赖项会被记录,连续调用不会有任何额外开销。@PatrickRoberts是的,这将是另一个很好的解决方案:)(尽管根据pObjName
的来源,可能需要先对其进行清理)我已经想到了这个选择。既然你也建议我,我就采用这个解决方案。谢谢