我试图在 Node.js 中动态调用函数以避免无限的 switch-case 列表。
这是我想要访问的文件实例:
var Object = require('../models/Object'); // it's a classic mongoose Schema's object
这是我的动态函数:
/***** post words *****/
router.post('/words', function (req, res) {
var word = req.body ;
var Theme = req.body.theme
[Theme].add[Theme](word, function(err, words) {
if(err) {
res.json(err);
throw err;
}
return res.json(words);
})
})
我们假设 object.name 是“Object”的情况。
我想要构建的函数必须调用另一个文件中的 addPost 方法。为了动态调用这个文件,我准备了一个计算名称属性机制。因此我总是根据我的需要调用相应的文件。如果我需要对象并且用户发布了对象的类别值,那么它将在对象文件上计算朝向良好目的地的帖子。所以我的计算名称属性如下所示:
console.log(req.body.name) // > "Object"
Name = req.body.name
console.log(Name) // > "Object"
现在好了,
当我显式输入要调用函数的对象名称时,如下所示:
Object.functionObject()
该功能运行良好。
但是如果我使用动态值调用,例如:
[名称].functionOf[名称]()
函数返回我:
TypeError: Cannot read property of undefined
另外,
我尝试了 ${Name}
但我的控制台返回了我:
TypeError: console.log(...) is not a function
我已经尝试在 Node.js 端安装 ES6,目前结果相同。
console.log 给我返回了巨大的值,这怎么可能?
最佳答案
[Theme].add[Theme]()
此代码创建一个以 Theme 作为第一个值的数组,然后调用 functionOf,该数组类型中不存在该函数。 addTheme 实际上是一个语法错误,但引擎永远不会到达它。
虽然我建议使用开关,但我认为你想做的是这样的
// define Object1, Object2 with functionObject()
var objectCollection = {};
objectCollection[Object1.name] = Object1;
objectCollection[Object2.name] = Object2;
// Then you get req.body.name later
var objectName = req.body.name;
// and call the method
objectCollection[objectName].functionObject()
这在技术上是可行的,但是有很多失败的可能性,并且以这种方式依赖反射让我感到紧张,因为你的客户需要知道内部工作原理(例如对象和函数名称)。这很糟糕。
如果这些对象的行为如此不同,您可能应该将它们分成单独的路由,并让您的客户端在您制作 API 时决定需要哪个。
您还可以创建一个工厂来返回正确的对象并将 switch 语句隐藏在那里。
关于javascript - Node.js 中的计算属性名称 ES5 - 当我动态调用函数时,控制台返回 TypeError : Cannot read property of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51108193/