从模块动态导入功能

时间:2020-08-10 12:29:58

标签: javascript node.js dynamic import

我在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不能工作,因为其中包含代码(我想是问题所在),但我想那是与原始帖子不同的问题,因此我可能会创建一个新帖子。

2 个答案:

答案 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中,然后使用变量导入任务所需的模块,并使用先前创建的变量访问所需的函数