【问题标题】:'TypeError: is not a function' in Node.jsNode.js 中的“TypeError:不是函数”
【发布时间】:2015-11-23 06:42:12
【问题描述】:

我在 Node.js 中运行以下代码时遇到错误

var assert = require('assert');
var request = require('request');
var index = require('./index');
it('verify javascript function', function(done) {
    var v2 = index.AddNumbers(5, 6);
    assert.equal(11, v2);
    done();
});

index.js 文件包含以下代码:

function AddNumbers(a,b){
    return a+b;
}

我做错了什么?

【问题讨论】:

  • 我在一个包含的文件中使用了函数之外的“return 语句”。删除它解决了问题。

标签: javascript node.js


【解决方案1】:

由于循环依赖,这种情况发生在我身上很多次,检查你是否有 2 个相互需要的类,将其中一个从需要另一个的类中删除,问题应该得到解决

【讨论】:

  • 你今天救了我 :)
  • 你为我节省了数小时的头撞墙时间。谢谢!
  • 哇。因为这个错误,我不得不重新构建我的应用程序。非常感谢。
  • 几个小时以来,我一直在尝试调试由此引起的问题。它在一个实用程序类中,其中确实有太多功能。将其拆分为更小的逻辑模块解决了这个问题,大概是通过减轻未识别的循环引用。 :)
  • 这在很多方面都是节点故障,但与往常一样,最重要的故障是无意义和误导性的错误消息。
【解决方案2】:

使用 NodeJS modules,要公开某些内容,您必须将其导出。将此添加到index.js 的末尾:

module.exports.AddNumbers = AddNumbers;

(这是使用旧的 CommonJS 模块。对于ESM,它将是export AddNumbers;


它正在我的机器上运行:

$猫索引.js 函数 AddNumbers(a,b){ 返回 a+b; } module.exports.AddNumbers = AddNumbers; $ 猫示例.js var index = require('./index'); var v2 = index.AddNumbers(5,6); 控制台.log(v2); $节点示例.js 11

【讨论】:

  • 我尝试了上面的行仍然遇到同样的错误。
  • @KarthickGk:那么还有其他问题,上面的方法有效。
【解决方案3】:

我是 Node JS 的初学者,所以我通过导入这样的函数设法得到了这个错误:

const { functionName } = require('./function')

而不是像这样:

const functionName = require('./function')

编辑我的帖子以添加解释,因为自从我编写它以来我已经了解了更多节点。如果一个模块导出一个包含多个函数的对象,函数如下:

module.exports = { functionName, otherFunction }

然后函数必须在导入期间从对象中解构出来,就像在第一个代码 sn-p 中一样。如果模块导出单个函数或默认函数,像这样:

 module.exports = functionName

那么必须直接导入tt,如第二个代码sn -p。

【讨论】:

  • 你过去的自我女士将我从未来(2022)中拯救出来。谢谢。
【解决方案4】:

如果您需要将特定组件、函数或变量公开。您必须使用 JavaScript 模块 exports 那些组件。

let add = (a,b)=>{
    return ( a+b);
}
module.exports.add=add;

或者如果你想暴露多个函数,你可以这样做。

let add = (a,b)=>{
    return (a+b);
}
let subtract = (a, b)=>{
    return (a-b);
}
module.exports={
   add : add,
   subtract : subtract
};

【讨论】:

    【解决方案5】:

    发生这种情况是因为两个文件相互引用,即您从文件 B 中的文件 A 调用函数,反之亦然,这称为循环依赖。

    【讨论】:

      【解决方案6】:

      “index.js”文件中的“AddNumbers”函数应该如下,

      function AddNumbers(a,b){
          var addition = function(a, b){
            return (a + b) ;
          };
      
          module.exports = {
             additionResult: addition
          };
      }
      

      你需要在你的“Node.js”文件中调用它,如下所示

      var assert = require('assert');
      var request = require('request');
      var index = require('./index');
      it('verify javascript function', function(done) {
          var v2 = index.additionResult(5, 6);
          assert.equal(11, v2);
          done();
      });
      

      这应该可行。请注意,您使用导出返回值的任何令牌名称调用该函数(为了清楚起见,我在这里使用了不同的名称)。几乎每个人都使用与函数名称相同的名称,因此不会造成混淆。同样在 ES6 中,如果你使用相同的名称,你可以直接导出,

      module.exports = {
             addition
      };
      

      而不是,

      module.exports = {
             addition: addition
      };
      

      因为您使用相同的名称。这是一个 ES6 特性。

      【讨论】:

        【解决方案7】:

        我在尝试学习 w3schools 的 Nodejs 教程时遇到了同样的问题。 我从他们那里复制了以下代码:

        exports.myDateTime = function () {
        return Date();
        };
        

        但是,这对我不起作用。为我解决问题的方法是在 export 关键字之前添加module.,如下所示:

        module.exports.myDateTime = function () {
        return Date();
        };
        

        【讨论】:

          【解决方案8】:

          https://medium.com/visual-development/how-to-fix-nasty-circular-dependency-issues-once-and-for-all-in-javascript-typescript-a04c987cf0de

          这篇文章可视化循环依赖注入 像子文件或嵌套文件一样尝试导入父文件或顶级文件

          repo.js

          service.js

          有 2 个文件

          service.js 通过导入使用 repo.js 文件 有用 但检查 repo.js 它试图导入 service.js 文件 它显示循环依赖注入警告

          【讨论】:

            【解决方案9】:

            我调试这个的一个简单方法(经过大约 2 天的故障排除)是实际了解为什么“x”不是一个函数。基本上,console.log(x) 查看返回的实际对象。原来我将 x 与另一个声明的变量冲突(尤其是当您使用 axios.res 和 req,res args 时。

            【讨论】:

              【解决方案10】:

              只需将函数作为参数传递即可解决您的问题

              现在您可以访问示例函数而无需在 sample2 文件中要求它,这解决了 typeError 的问题

              //sample 
              const sample2 = require('./sample2');
              const sample = async (payload) => {
                const { value }= payload;
                const response = sample2({sample});
              }
              
              
              // sample2
              const sample2 = async ({sample}) => {
                const response = sample({value});
              }
              module.exports = sample2;
                
              

              【讨论】:

              • const sample2 = require('./sample2') const sample = async (payload)=>{ const {value}= payload;常量响应 = sample2({sample}); } module.exports = sample 在此处输入代码 const sample2 = async ({sample})=>{ const response = sample({value}); }
              【解决方案11】:

              我在导出时犯的一个愚蠢错误是:

              module.exports = [module_name_1, module_name_2, ..., module_name_n]
              

              正确的做法是:

              module.exports = {module_name_1, module_name_2, ..., module_name_n}
              

              【讨论】:

              • 您的回答似乎与问题无关
              • 这可能是相关的:我更熟悉前端 javascript,但是如果您不正确地导出模块定义,当您尝试使用它们时,您可能会收到 OP 描述的类型错误(可能你尝试调用的东西是未定义的)。 ANKIT,如果这是你的意思,你可以在你的答案中添加这个理由。
              猜你喜欢
              • 2018-03-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-21
              • 2018-06-14
              • 1970-01-01
              相关资源
              最近更新 更多