简体   繁体   中英

How to make sure a module is loaded in NodeJS

This is a problem I faced more than one. Here is an example file structure:

app.js
folder
-- index.js
-- module1.js
-- module2.js

From app.js , the entry point of my application, I require folder/index.js . This file itself is just a loader who requires all the other files in the directory. module1.js and module2.js both define some methods I want to use eventually. They are never directly required by app.js since index.js takes care of that and adds common helper utilities and applies some transformations to these modules.

All works well if I then use some methods defined in those files from app.js after I required them. But the problem comes when a method defined in module2.js wants to use a method defined in method1.js (or vice-versa). Sometimes it will work, sometimes not (in folders with multiple files I didn't get to find out when precisely it works and when it doesn't yet).

If, from module2.js I require ./index.js and then use methods in it defined by module1.js , I sometimes get Cannot read property 'myMethod' of undefined . I assume it has to do with the order the modules are required by index.js , but I can't seem to find a solution to this common problem (other than duplicating code or not using methods of these other modules).

Is there a common solution to this problem? I tried doing something like this :

var modules = require(./index.js);

exports.myMethod = function() {
  if(!modules.module1 || !modules.module1.myOtherMethod) {
    modules = require('./index.js');
  }
  modules.module1.myOtherMethod();
};

But it doesn't to do anything, modules.module1 is still undefined.

It just sounds like module should require module2 . That's the solution to module1 needing to call methods in module2 .

If you're worried about many calls to require , don't. That's standard practice in every programming language I've used (in particular look at the import statements in any Java program. Java is verbose, I know, but this is correct practice.)

It's definitely bad practice to look at code in one module and have no idea where anything comes from, because the require statements are missing.

You have a circular dependency problem. Try moving some of the common functions to a third file and have module1 and module2 require it, or make sure that one of them requires the other in one way only.

Never ever require a file that requires the current file back.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM