TypeError方法不是函数

时间:2019-10-24 03:12:45

标签: node.js mongodb express server typeerror

我在服务器上的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网关超时。

1 个答案:

答案 0 :(得分:2)

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 }
     }
   }
 };