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 functionat 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:3Process 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);
Best Answer
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')})()
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.
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
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 */ }
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.
I've faced to something like this too.in your routes file , export the function as an object like this :
module.exports = {hbd: handlebar}
and in your app file , you can have access to the function by .hbdand there is no ptoblem ....!
In my case i fix when i put the S in the module.exportS,
BEFORE:
module.export = () => {}
AFTER:
module.exports = () => {}
I don't know how but in may case it got fixed when I changed
require('./routes')(app)
to
require('./routes')