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

IT技术 javascript node.js require
2021-02-25 03:14:24

我试图要求一个文件,然后将它传递给一个 var。我正在按照教程创建身份验证系统。在编写 server.js 文件并尝试编译后,我遇到了 BSON 错误,因此我更改了需要在 mongoose 中发布它的版本的行。

这是我的代码和错误:

服务器.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);

6个回答

对我来说,当我立即调用函数,我需要把;在年底require()

错误:

const fs = require('fs')

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

好的:

const fs = require('fs');

(() => {
  console.log('wow')
})()
如果代码在库中,有哪些选项?我有一个 node_modules 库(node-mailjet),它根本不使用分号。我可以在本地使用 Webpack 进行构建,但是当我在 Docker 上构建时会出现此错误:(
2021-04-21 03:14:24
很棒的解决方案!请注意,您实际上应该在每个自调用函数之前放置分号。我调整了这个结构:;(() => {})()
2021-04-24 03:14:24
我的天啊!!我来自那里puppeteer,几乎在那里提出了一个问题,直到我在这里找到了一个问题。呼……没想到;会这么麻烦。
2021-04-29 03:14:24
是的,这是在“JS 中的分号”辩论中支持分号的一个很好的论据。幸运的是,没有分号似乎只在 IIFE 的上下文中成为问题,它已经过时了
2021-05-15 03:14:24
这也是我的问题!问题实际上是在这种情况下运行时会忽略空格,因此您似乎将函数体() => {}作为参数传递给require( ... ). 糟糕的!
2021-05-17 03:14:24

我认为这意味着module.exports在您的./app/routesmodule中未分配为函数,因此require('./app/routes')不会解析为函数,因此,您不能将其称为这样的函数require('./app/routes')(app, passport)

让我们看看./app/routes,如果你需要我们进一步评论说。

它应该看起来像这样;

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

您正在导出一个函数,然后可以像require('./app/routes')(app, passport).


可能发生类似错误的另一个原因是,如果您有一个循环module依赖关系,其中module A 正在尝试,require(B)而module B 正在尝试require(A)发生这种情况时,require()子系统会检测到它,其中一个会返回null,因此尝试将其作为函数调用是行不通的。在这种情况下,解决方法是移除循环依赖,通常是将公共代码分解为第三个module,这两个module都可以单独加载,尽管修复循环依赖的细节对于每种情况都是独一无二的。

或者: module.exports.functionName = function functionName(app, passport) { ... }
2021-04-22 03:14:24
@Magne - 但是 OP 正在尝试这样做require('./app/routes')(app, passport);,这不会像您显示导出的方式那样工作。
2021-04-27 03:14:24
没错,我的错。我的用例略有不同。我想导出一个命名函数。
2021-05-12 03:14:24

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

IOW,moduleA需要moduleB,moduleB需要moduleA。

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

如何处理 Node.js 中的循环依赖

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

记得导出你的routes.js.

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

exports = function(app, passport) {

/* write here your code */ 

}