NodeJs:TypeError:require(…)不是一个函数


86

我试图要求一个文件,然后将其传递给var。我正在按照教程创建身份验证系统。编写server.js文件并尝试编译后,出现bson错误,因此我更改了需要它的发行版本的猫鼬代码。

这是我的代码和错误:

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无法正确加载,但我不知道为什么或如何修复它。

根据评论进行编辑:

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


您可以console.log(require)在出现故障的线路之前吗?您不需要在服务器端使用requireJS,node.js具有内置的模块系统(CommonJS,也使用require功能)。似乎正在改变全局require变量。
卡夫(Kraf),2015年

Answers:


107

我认为这意味着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,因此尝试将其作为函数调用将不起作用。在这种情况下,解决方法是删除循环依赖关系,通常是通过将通用代码分解为第三个模块来实现,尽管修复循环依赖关系的细节在每种情况下都是唯一的,但这两个模块都可以分别加载。


或:module.exports.functionName = function functionName(app, passport) { ... }
Magne

@Magne-但是OP正在尝试这样做require('./app/routes')(app, passport);,但这与您显示导出的方式不起作用。
jfriend00

是的,我的坏。我的用例略有不同。我想导出一个命名函数。
Magne

61

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

错误:

const fs = require('fs')

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

好:

const fs = require('fs');

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

7
这也是我的问题!问题实际上是在这种情况下运行时会忽略空格,因此似乎您要将函数体() => {}作为参数传递给所返回的内容require( ... )。可怕!
Will Brickner '19

是的,在“ JS分号”辩论中,这是支持分号的一个很好的论点。幸运的是,没有分号的似乎是问题只在IIFEs,其正在下降的时尚出的背景下
JP卢

1
哦,我的上帝!!我来自那里puppeteer,几乎要在那里问一个问题,直到在这里找到一个。ew ...从来没有想过这;会给我带来太大麻烦。
Irfandy Jip

1
很好的解决方案!请注意,实际上您应该在每个自调用函数之前放置分号。我调整了此结构:;(() => {})()
德米特里

如果代码在库中,有哪些选择?我有一个node_modules库(node-mailjet),它根本不使用分号。我可以在本地使用Webpack ok进行构建,但是当我在Docker上构建时,它会收到此错误:(
JavierGuzmán


0

对我来说,在分支之间切换时会遇到类似的错误-一个使用较新版本的@google-cloud/datastore软件包(“ typescriptish”),它以数据存储构造函数的形式返回对象作为导出对象的属性之一,而我切换到其他分支来执行一项任务,即较旧的数据存储版本在那里被使用,它将“直接”导出数据存储区构造函数作为module.exports值。我收到错误消息是因为node_modules仍然有我切换过来的分支使用的较新模块。


0

我也遇到过这样的事情。在路由文件中,将函数导出为这样的对象:

 module.exports = {
     hbd: handlebar
 }

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


-1

请记住要导出您的文件routes.js

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

exports = function(app, passport) {

/* write here your code */ 

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.