【问题标题】:import module Error is not a function?导入模块报错不是函数?
【发布时间】:2017-01-25 10:44:50
【问题描述】:

我有文件要导出'item-state-manager.js':

module.exports.aggregate_states = function (member_states) {
    console.log(member_states);
 }

其他文件应该导入这个模块并使用函数'aggregate_states':

var aggregate_states = require("./item-state-manager.js")

module.exports.saveItem = function () {
 var aggregate = aggregate_states("state");
}

但我收到错误:

TypeError: aggregate_states is not a function

我是否导入 'item-state-manager.js' 错误?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    据我所知 require 返回 module.exports 对象。

    如果 aggregate_states 是您要导出的唯一函数,请使用此函数。

    module.exports = function (member_states) {
        console.log(member_states);
    }
    

    否则像这样导入。

    var aggregate_states = require("./item-state-manager.js").aggregate_states;
    

    【讨论】:

      【解决方案2】:

      您没有正确导入模块。使用

      直接导入函数
      var aggregate_states = require("./item-state-manager.js").aggregate_states;
      

      或者导入模块并调用函数

      var stateManager = require("./item-state-manager.js");
      // And use it like this
      stateManager.aggregate_states(/*...*/)
      

      如果您使用的是最新版本的节点,您也可以这样做

      const { aggregate_states } = require("./item-state-manager.js");
      

      【讨论】:

        【解决方案3】:

        最近我在一个项目上运行我的(最小)测试套件时遇到了同样的错误,TypeError: (0 , _store.withToken) is not a function。令人困惑的是,withToken 函数在许多测试中都很好,但在其他测试中却不行。

        经过大量挖掘,我最终将其缩小为cyclical dependency 的问题。

        重构我的代码以消除周期性依赖关系,从而解决了问题并且错误消失了。具体来说,我必须将一些相互引用的文件合并到一个更大的文件中,这样不太整洁,但可以解决这个问题。

        在我的例子中,因为我的withToken函数引用了store,而store引用了withToken,这两个函数不能同时设置,所以设置storewithToken需要导入,并且要使用withToken,它需要导入的store

        【讨论】:

        • 祝福您,先生!当我看到这个时,我的快速测试是在依赖项的一侧注释掉需求,并且这个问题得到了证实。尽管任何一方的导入函数从未在任何时候循环回来,但似乎它们只是相互要求就足以导致这种情况。
        【解决方案4】:

        试试这个:

        var aggregate_states = require("./item-state-manager.js").aggregate_states;
        
        module.exports.saveItem = function () {
         var aggregate = aggregate_states("state");
        }
        

        aggregate_states 只是整个返回模块的一个属性,当您需要时,您会获得整个模块,它是一个看起来像这样的Object

        {
            aggregate_states: function() {...}
        }
        

        【讨论】:

          【解决方案5】:

          ------在导出文件中

          声明要正常导出的函数... 函数聚合状态(成员状态)

          在该 .js 文件的末尾添加... 模块.exports = { 聚合状态:聚合状态, }

          -----在导入文件中

          导入你想要的文件... const aggregate_states = require("./item-state-manager.js");

          叫它... item-state-manager.aggregate_state(member_states);

          【讨论】:

            猜你喜欢
            • 2019-08-01
            • 2020-01-26
            • 2017-01-03
            • 2021-12-20
            • 1970-01-01
            • 2018-10-30
            • 2016-12-15
            • 2016-11-01
            • 2022-06-18
            相关资源
            最近更新 更多