NodeJs : TypeError: require(...) is not a function

Posted

技术标签:

【中文标题】NodeJs : TypeError: require(...) is not a function【英文标题】: 【发布时间】:2016-01-05 14:36:26 【问题描述】:

我试图要求一个文件,然后将它传递给一个 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 没有正确加载,但我不知道为什么或如何修复它。

因评论而编辑:

如问,here 是console.log(require); 的结果

【问题讨论】:

你能在失败的那一行之前console.log(require) 吗?服务器端应该不需要 requireJS,node.js 内置了一个模块系统(CommonJS,也使用require 函数)。似乎有些东西正在改变全局 require 变量。 【参考方案1】:

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

错误:

const fs = require('fs')

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

好:

const fs = require('fs');

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

【讨论】:

这也是我的问题!问题实际上是在这种情况下运行时会忽略空格,因此您似乎将函数体() =&gt; 作为参数传递给require( ... ) 返回的任何内容。太可怕了! 是的,这是一个很好的论据,支持在“JS 中的分号”辩论中使用分号。幸运的是,分号的缺失似乎只在 IIFE 的背景下成为问题,这已经过时了 天哪!我来自puppeteer,几乎在那里请求一个问题,直到我在这里找到一个问题。呼……没想到;会这么困扰我。 很好的解决方案!请注意,您实际上应该将分号放在每个自调用函数之前。我调整了这个结构:;(() =&gt; )() 如果代码在库中,有哪些选项?我有一个根本不使用分号的 node_modules 库(node-mailjet)。我可以在本地使用 Webpack 构建,但是当我在 Docker 上构建时会出现此错误:(【参考方案2】:

我认为这意味着您的 ./app/routes 模块中的 module.exports 未分配为函数,因此 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 - 但是 OP 正在尝试执行 require('./app/routes')(app, passport); 这将无法按照您显示导出的方式工作。 没错,我的错。我的用例略有不同。我想导出一个命名函数。【参考方案3】:

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

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

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

How to deal with cyclic dependencies in Node.js

【讨论】:

【参考方案4】:

对我来说,在分支之间切换时我遇到了类似的错误 - 一个使用了 @google-cloud/datastore 包的更新(“typescriptish”)版本,它返回带有 Datastore 构造函数的对象作为导出对象的属性之一,我切换到另一个分支任务,在那里使用了较旧的数据存储版本,它将数据存储构造函数“直接”导出为 module.exports 值。我收到错误是因为 node_modules 仍然有我切换的分支使用的较新模块。

【讨论】:

【参考方案5】:

记得导出你的routes.js

routes.js,在这个功能模块中写下你的路由和所有代码:

exports = function(app, passport) 

/* write here your code */ 


【讨论】:

【参考方案6】:

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

 module.exports = 
     hbd: handlebar
 

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

【讨论】:

【参考方案7】:

我不知道如何,但可能在我更改时它得到了修复

require('./routes')(app)

require('./routes')

【讨论】:

【参考方案8】:

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

之前:

module.export = () => 

之后:

module.exports = () => 

【讨论】:

以上是关于NodeJs : TypeError: require(...) is not a function的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”

NodeJS Mongoose record.save TypeError

TypeError:无法读取未定义的nodejs请求http的属性'0'

nodejs-dialogflow 库返回 TypeError: dialogflow.SessionsClient 不是构造函数

TypeError:无法在nodejs中读取未定义的属性“email”

TypeError:无法使用nodejs在mongodb中读取null的属性“项目”