调用导入的类的静态方法会引发TypeError错误

时间:2019-06-14 14:59:55

标签: javascript node.js commonjs

我正在尝试从创建的导入模块中访问静态方法,但这会引发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上运行(显然,尽管我没有进行任何导入,所以我认为这与之相关)

2 个答案:

答案 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检查代码中是否存在循环依赖关系(以及许多其他有用的东西)。