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

191,061

Solution 1

I think this means that module.exports in your ./app/routes module is not assigned to be a function so therefore require('./app/routes') does not resolve to a function so therefore, you cannot call it as a function like this require('./app/routes')(app, passport).

Show us ./app/routes if you want us to comment further on that.

It should look something like this;

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

You are exporting a function that can then be called like require('./app/routes')(app, passport).


One other reason a similar error could occur is if you have a circular module dependency where module A is trying to require(B) and module B is trying to require(A). When this happens, it will be detected by the require() sub-system and one of them will come back as null and thus trying to call that as a function will not work. The fix in that case is to remove the circular dependency, usually by breaking common code into a third module that both can separately load though the specifics of fixing a circular dependency are unique for each situation.

Solution 2

For me, when I do Immediately invoked function, I need to put ; at the end of require().

Error:

const fs = require('fs')

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

Good:

const fs = require('fs');

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

Solution 3

For me, this was an issue with cyclic dependencies.

IOW, module A required module B, and module B required module A.

So in module B, require('./A') is an empty object rather than a function.

How to deal with cyclic dependencies in Node.js

Solution 4

Remember to export your routes.js.

In routes.js, write your routes and all your code in this function module:

exports = function(app, passport) {

/* write here your code */ 

}

Solution 5

For me, I got similar error when switched between branches - one used newer ("typescriptish") version of @google-cloud/datastore packages which returns object with Datastore constructor as one of properties of exported object and I switched to other branch for a task, an older datastore version was used there, which exports Datastore constructor "directly" as module.exports value. I got the error because node_modules still had newer modules used by branch I switched from.

Share:
191,061

Related videos on Youtube

taigi100
Author by

taigi100

Updated on November 12, 2021

Comments

  • taigi100
    taigi100 over 2 years

    I am trying to require a file and afterwards pass it to a var. I am following this tutorial to create an authentication system. After writing the server.js file and trying to compile I got a BSON error therefore I changed the line that required the release version of it in mongoose.

    Here are my code and error:

    server.js

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

    Error

    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
    

    I have read that this usually means that requireJS is not getting loaded properly yet I am not aware why or how to fix it.

    Edit due to comment:

    As asked, here is the result of console.log(require);

    • kraf
      kraf over 8 years
      Can you console.log(require) before the line that fails? You should not need requireJS on the server side, node.js has a module system built in (CommonJS, also uses require function). Something seems to be changing the global require variable.
  • Will Brickner
    Will Brickner about 5 years
    This was my problem as well! The problem really is that the runtime ignores whitespace in this case, and so it seems you're passing your function body () => {} as an argument to whatever is returned by require( ... ). Terrible!
  • JP Lew
    JP Lew almost 5 years
    yeah, this is a good argument in favor of semicolons in the 'semicolons in JS' debate. Fortunately, the absence of semicolons seems to be problem only in the context of IIFEs, which are falling out of fashion
  • Irfandy Jip
    Irfandy Jip over 4 years
    Oh my god!! I came from puppeteer and almost requested an issue there until I found one here. Phew... never thought that ; would trouble me so much.
  • Dmitry
    Dmitry about 4 years
    Great solution! Note that you actually should put the semicolon before every self-invoking function. I adapted this construction: ;(() => {})()
  • Javier Guzmán
    Javier Guzmán over 3 years
    What are the options if the code is within a library? I have a node_modules library (node-mailjet) which does not use semicolons at all. I can build with Webpack ok locally but when I build on Docker then it get this error :(
  • Magne
    Magne over 3 years
    Or: module.exports.functionName = function functionName(app, passport) { ... }
  • jfriend00
    jfriend00 over 3 years
    @Magne - But the OP is trying to do require('./app/routes')(app, passport); which will not work the way you show the export.
  • Magne
    Magne over 3 years
    True, my bad. My use case was slightly different. I wanted to export a named function.
  • Victor
    Victor almost 3 years
    Oh my god I can't believe this! I lost HOOOOURS trying to fix this issue and it was just a ;!
  • Hrishikesh Baidya
    Hrishikesh Baidya almost 3 years
    Great man. it worked require("./generateBearerToken");(() => {})()