NodeJs:TypeError:require(...)不是函数

时间:2015-10-08 06:11:10

标签: javascript node.js require

我正在尝试需要一个文件,然后将其传递给var。我正在关注this教程来创建一个身份验证系统。在编写server.js文件并尝试编译后,我得到了一个bson错误,因此我更改了需要在mongoose中发布版本的行。

以下是我的代码和错误:

server.js

    require('./app/routes')(app, passport);

错误

require('./app/routes')(app, passport);
                   ^

TypeError: require(...) is not a function
           at Object.<anonymous> (d:\Node JS learning\WorkWarV2\server.js:38:24)
           at Module._compile (module.js:434:26)
           at Object.Module._extensions..js (module.js:452:10)
           at Module.load (module.js:355:32)
           at Function.Module._load (module.js:310:12)
           at Function.Module.runMain (module.js:475:10)
           at startup (node.js:117:18)
           at node.js:951:3

Process finished with exit code 1

我已经读过这通常意味着requireJS没有正确加载但我不知道为什么或如何解决它。

由于评论而编辑:

根据要求,hereconsole.log(require);

的结果

8 个答案:

答案 0 :(得分:72)

我认为这意味着module.exports模块中的./app/routes未被指定为函数,因此require('./app/routes')无法解析为函数,因此您无法将其称为这个函数就像require('./app/routes')(app, passport)一样。

如果您希望我们对此进行进一步评论,请告诉我们./app/routes

看起来应该是这样的;

module.exports = function(app, passport) {
    // code here
}

您正在导出一个可以像require('./app/routes')(app, passport)一样调用的函数。

可能发生类似错误的另一个原因是,如果您有一个循环模块依赖项,其中模块A正在尝试require(B)而模块B正在尝试require(A)。当发生这种情况时,它将由require()子系统检测到,其中一个将返回null,因此尝试将其称为函数将无效。在这种情况下的修复是删除循环依赖,通常是通过将公共代码分成第三个模块,两个都可以单独加载,虽然修复循环依赖的细节对于每种情况都是唯一的。

答案 1 :(得分:10)

对我来说,这是一个循环依赖的问题。

IOW,模块A需要模块B,模块B需要模块A.

因此在模块B中,require('./A')是一个空对象而不是一个函数。

How to deal with cyclic dependencies in Node.js

答案 2 :(得分:4)

对我来说,当我执行立即调用函数时,需要将;放在require()的末尾。

错误:

const fs = require('fs')

(() => {
  console.log('wow')
})()

好:

const fs = require('fs');

(() => {
  console.log('wow')
})()

答案 3 :(得分:0)

对我来说,在分支之间切换时遇到类似的错误-一个使用了较新版本的@google-cloud/datastore包,该包返回带有Datastore构造函数的对象作为导出对象的属性之一,并且切换到其他分支对于某个任务,在此使用了较旧的数据存储区版本,该版本将“直接”将数据存储区构造函数导出为module.exports值。我收到错误消息是因为node_modules仍然有我切换过来的分支所使用的较新模块。

答案 4 :(得分:0)

我也遇到过类似的问题。 在您的路由文件中,将函数导出为这样的对象:

 module.exports = {
     hbd: handlebar
 }

,在您的应用文件中,您可以通过.hbd访问该功能 而且没有问题....!

答案 5 :(得分:0)

在我的情况下,当我将 S 放入 module.exportS 时,我会修复,

之前:

module.export = () => {}

之后:

module.exports = () => {}

答案 6 :(得分:-1)

只需在需要文件的箭头功能中包装

答案 7 :(得分:-3)

请务必导出routes.js

routes.js中,在此功能模块中编写路线和所有代码:

exports = function(app, passport) {

/* write here your code */ 

}