【问题标题】:TypeError method is not a functionTypeError 方法不是函数
【发布时间】:2020-02-20 08:04:35
【问题描述】:

我的服务器上的 GET 方法不断收到 TypeError。

确切的错误是:

 TypeError: testCont.createDevice is not a function

这通常不是我编写代码的方式。我尝试这样做的原因是我可以从不同的控制器调用路由。

这就是我的代码的基础。

index.js

它包含所有常见的东西。

这是我导入控制器的地方:

 var testCont = require('./api/controllers/testController');

这是我的路线声明:

 const testRoutes = require('./api/routes/testRoutes');
 testRoutes(app, testCont);

testController.js 看起来像这样...

 'use strict';
 module.exports = function() {
   var mod = {
     createDevice() {
       return{ success: true }
     }
   }
   return mod;
 };

这里是 testRoutes.js 类...

 module.exports = function(app, testCont) {
   app.get('/api/v1.2/devices', (req, res) => {
     testCont.createDevice()
   })
 };

就像我提到的,这个想法是最终在需要来自响应的信息时从另一个控制器调用路由。

有谁知道为什么它告诉我 createDevice 不是一个函数?我尝试了很多不同的东西。

提前致谢。

更新:

根据要求,我正在展示已实施的建议更改。

index.js 看起来像这样...

 var testCont = require('./api/controllers/testController');
 var testRoutes = require('./api/routes/testRoutes');
 testRoutes(app, testCont);

当这部分代码被注释掉时,其他控制器和路由中的所有其他调用都可以正常工作。

整个 testController.js 文件如下所示:

 'use strict';
 module.exports = function() {
   createDevice() {
       return{ success: true }
     }
 };

整个 testRoutes.js 如下所示:

 module.exports = function(app, testCont) {
   app.get('/api/v1.2/devices', (req, res) => {
     testCont.createDevice()
   })
 };

将代码添加到 index.js 文件时,我收到 502 Bad Gateway 错误。

更新 2:

我对我的疏忽实施了更正...

 'use strict';
 module.exports = {
   createDevice() {
       return{ success: true }
     }
  };

这就是得到 504 网关超时的现在的样子。

【问题讨论】:

  • 似乎在 testController.js 中,您正在导出一个函数,而在 testRoutes.js 中,您正试图访问该函数上的 createDevice() 。快速修复:- testCont().createDevice();

标签: node.js mongodb express server typeerror


【解决方案1】:

你的 testController.js 的编写方式,你必须改变这个:

var testCont = require('./api/controllers/testController');

到这里:

var testCont = require('./api/controllers/testController')();

.createDevice() 方法不在导出的对象上。当你调用它时,导出函数返回的对象是它。因此,您必须更改导出的工作方式以便直接导出对象,或者您必须调用函数以获取它返回的对象。


或者,您可以通过更改导出来直接导出对象:

'use strict';
 module.exports = function() {
   var mod = {
     createDevice() {
       return{ success: true }
     }
   }
   return mod;
 };

到这里:

'use strict';
 module.exports = {
     createDevice() {
       return{ success: true }
     }
   }
 };

【讨论】:

  • 我尝试了这两种方法,但不幸的是,由于某种原因,两者都不起作用。
  • @MarcBlazyk - 然后,您要么没有正确实现我的建议,要么在完整代码中还有其他错误。对于您未与我们共享的修改代码,我们真的无法提供进一步帮助。这些是您第一次使用您展示的代码询问的特定问题的解决方案。
  • 当您删除我发布的所有内容时,代码工作得非常好。因此,这表明问题出在我发布的代码块上。
  • @MarcBlazyk - 在问题末尾添加一个编辑,显示您如何修改代码以合并此答案并准确显示修改后的代码出现的错误。您要求我们告诉您为什么您的修改后的代码(您没有向我们展示)不起作用。对于我们看不到的代码,我们无法为您提供帮助。
  • 当然,这完全公平。两分钟,我会发布。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2020-06-29
  • 2020-06-17
相关资源
最近更新 更多