我在nodejs / Javascript中无法完成以下任务。我有多个模块将根据情况导入(module1,module2,module3)。我设法使用
动态导入了它们
var language = require(variable + 'path')
问题在于要使用的函数也应该是动态的,并且不相同,因此有时我需要从module1获得函数“ create”,但是有时我可能希望函数“ update”而不是“ create”。我试图在变量上创建/更新(取决于任务的选项),但是对于language.variable却不起作用,因为它假定“变量”是模块中函数的名称(我想)。 / p>
这甚至有可能吗?有人可以解决吗?
编辑:例如模块1和模块2。用户将在平台中指定他需要的模块,例如。模块1以及他要如何处理,例如使用该语言创建一个新用户(该功能也由用户提供,例如createPerson({name:form.getFirstName,lastName:form.getLastName}))。因此,在后端中,我现在必须导入我需要执行的模块(模块1),但是还需要导入正确的功能,例如该模块中的“ createPerson”,这样我就可以立即使用用户提供的功能。但是,正如我现在所拥有的那样,我确实设法拥有了可以使用的功能和库,除非有人有更好的方法,否则我将其发布为答案:
expression.split('({',1)[0]
var language = require(variable + 'myPath')
language[`${temp}`](expression)
temp具有用户提供的表达式的第一部分,在本例中为createPerson,因此我可以从模块中动态使用它。我现在面临的问题是表达式是一个字符串,例如“ {name:form.getFirstName,lastname:form.getLastName}”,但应为对象。但是JSON.parse不能工作,因为其中包含代码(我想是问题所在),但我想那是与原始帖子不同的问题,因此我可能会创建一个新帖子。
答案 0 :(得分:0)
function haveThisClassFunctionX(classInstance, functionName) {
return Object.getOwnPropertyNames(classInstance)
.concat(Object.getOwnPropertyNames(classInstance.__proto__))
.filter(item => typeof classInstance[item] === 'function')
.some(v => v === functionName);
}
class DeutschModule {
constructor() {
this.language = 'de';
}
create() {
return this.language;
}
}
class EnglishModule {
constructor() {
this.language = 'en';
}
create() {
return this.language;
}
update() {
return this.language;
}
}
const languages = [
new DeutschModule(),
new EnglishModule(),
];
for (const lang of languages) {
console.log(lang.constructor.name);
console.log('has create: ' + haveThisClassFunctionX(lang, 'create'));
console.log('has update: ' + haveThisClassFunctionX(lang, 'update'));
}
答案 1 :(得分:0)
正如我在编辑中提到的那样,这是通过以下方式实现的:
temp = expression.split('({',1)[0]
var language = require(variable + 'myPath')
language[`${temp}`](expression)
这样,我将函数名称存储在temp中,然后使用变量导入任务所需的模块,并使用先前创建的变量访问所需的函数