我正在尝试从创建的导入模块中访问静态方法,但这会引发TypeError错误-说明该方法不存在。
我尝试以不同的方式导出模块。如果我将其用作实例方法而不是静态方法,则可以调用该方法,但是它没有使用与该类相关的任何东西,我认为它应该是静态的。
以下静态方法: ( Bot.js )
const Bot = class Bot {
static getCommandIndex(message) {
if (!message.beginsWith('/')) {
return undefined;
}
return message.split(' ');
}
}
module.exports = Bot;
尝试使用它的模块: ( BotUpdateHandler.js )
const Bot = require('./Bot');
module.exports = class BotUpdateHandler {
async handle(update) {
const txt = update.msg.txt;
const command = Bot.getCommandIndex(txt);
}
}
我已经尝试过像这样导出和导入模块:
// Exporting the module (Bot.js)
module.exports = { Bot };
// Importing the module (BotUpdateHandler.js)
const { Bot } = require('./Bot');
但是那也不行。
TypeError: Bot.getCommandIndex is not a function
我正在使用Node.js v10.16.0,当我在开发人员控制台中对其进行检查时,它似乎可以在浏览器JavaScript上运行(显然,尽管我没有进行任何导入,所以我认为这与之相关)
答案 0 :(得分:0)
我认为您的模块定义还可以,但是错误的是BotUpdateHandler
:
const Bot = require('./Bot');
module.exports = class BotUpdateHandler {
async handle(update) {
const command = Bot.getCommandIndex(txt);
}
}
Bot.getCommandIndex(txt)
是通过txt
参数调用的,然后Bot类尝试对其执行beginsWith
方法,但是txt
是未定义的(可能您想通过var进行更改) update
。
因此,不存在的方法是beginsWith
上的txt
。
const Bot = require('./Bot');
module.exports = class BotUpdateHandler {
async handle(update) {
const command = Bot.getCommandIndex(update);
}
}
答案 1 :(得分:0)
因此,我继续研究该问题,并试图弄清问题到底是什么。
我来自C#领域,因此,我习惯于无处不在地使用using
语句。但是,对于NodeJS,您不能期望require
的行为与using
的{{1}}语句相同-因为require
需要花费一些时间来设置导出,并且如果您具有两个相互依赖的模块-这将创建一个称为循环依赖项的东西。
经过一番挖掘,我发现了this的文章和this有关循环依赖的问题。最终,最好避免代码中具有循环依赖性,如上面链接的问题的答案中所列出的那样(具有一个管理两个模块之间共享代码的顶级模块)。
但是,也有许多巧妙的技巧可以解决此问题。我使用的是在需要静态方法之前使用require
语句。
require
此外,我发现您可以使用madge检查代码中是否存在循环依赖关系(以及许多其他有用的东西)。