Folders as modules within folders as modules NodeJS
I am having trouble requiring from parent directories within NodeJS. I have read this post, but still couldn't figure it out.
node.js require from parent folder
This is my file structure:
-- components/
-- windows/
-- index.js
-- index.js
-- main.js
This is the code:
// /main.js
var components = require("./components")
components.windows.inner()
// /components/index.js
module.exports = {
windows: require("./windows"),
foo: "foo",
}
// /components/windows/index.js
var components = require("./..")
module.exports.inner = function() {
console.log(components.foo)
}
When I run main.js
, the inner()
function prints undefined
.
Why is it printing undefined? Shouldn't it print foo? Am I missing something about how Node works?
javascript node.js node-modules circular-dependency
add a comment |
I am having trouble requiring from parent directories within NodeJS. I have read this post, but still couldn't figure it out.
node.js require from parent folder
This is my file structure:
-- components/
-- windows/
-- index.js
-- index.js
-- main.js
This is the code:
// /main.js
var components = require("./components")
components.windows.inner()
// /components/index.js
module.exports = {
windows: require("./windows"),
foo: "foo",
}
// /components/windows/index.js
var components = require("./..")
module.exports.inner = function() {
console.log(components.foo)
}
When I run main.js
, the inner()
function prints undefined
.
Why is it printing undefined? Shouldn't it print foo? Am I missing something about how Node works?
javascript node.js node-modules circular-dependency
1
You have a circular dependency, that's what doesn't work.require("./..")
returns an empty object, the export that gets later overwritten by themodule.exports =
assignment incomponents/index.js
. Use dependency injection instead.
– Bergi
Nov 11 at 17:38
What is dependency injection? @Bergi
– Matt X
Nov 11 at 17:41
add a comment |
I am having trouble requiring from parent directories within NodeJS. I have read this post, but still couldn't figure it out.
node.js require from parent folder
This is my file structure:
-- components/
-- windows/
-- index.js
-- index.js
-- main.js
This is the code:
// /main.js
var components = require("./components")
components.windows.inner()
// /components/index.js
module.exports = {
windows: require("./windows"),
foo: "foo",
}
// /components/windows/index.js
var components = require("./..")
module.exports.inner = function() {
console.log(components.foo)
}
When I run main.js
, the inner()
function prints undefined
.
Why is it printing undefined? Shouldn't it print foo? Am I missing something about how Node works?
javascript node.js node-modules circular-dependency
I am having trouble requiring from parent directories within NodeJS. I have read this post, but still couldn't figure it out.
node.js require from parent folder
This is my file structure:
-- components/
-- windows/
-- index.js
-- index.js
-- main.js
This is the code:
// /main.js
var components = require("./components")
components.windows.inner()
// /components/index.js
module.exports = {
windows: require("./windows"),
foo: "foo",
}
// /components/windows/index.js
var components = require("./..")
module.exports.inner = function() {
console.log(components.foo)
}
When I run main.js
, the inner()
function prints undefined
.
Why is it printing undefined? Shouldn't it print foo? Am I missing something about how Node works?
javascript node.js node-modules circular-dependency
javascript node.js node-modules circular-dependency
edited Nov 11 at 17:40
Bergi
363k57540864
363k57540864
asked Nov 11 at 17:31
Matt X
1138
1138
1
You have a circular dependency, that's what doesn't work.require("./..")
returns an empty object, the export that gets later overwritten by themodule.exports =
assignment incomponents/index.js
. Use dependency injection instead.
– Bergi
Nov 11 at 17:38
What is dependency injection? @Bergi
– Matt X
Nov 11 at 17:41
add a comment |
1
You have a circular dependency, that's what doesn't work.require("./..")
returns an empty object, the export that gets later overwritten by themodule.exports =
assignment incomponents/index.js
. Use dependency injection instead.
– Bergi
Nov 11 at 17:38
What is dependency injection? @Bergi
– Matt X
Nov 11 at 17:41
1
1
You have a circular dependency, that's what doesn't work.
require("./..")
returns an empty object, the export that gets later overwritten by the module.exports =
assignment in components/index.js
. Use dependency injection instead.– Bergi
Nov 11 at 17:38
You have a circular dependency, that's what doesn't work.
require("./..")
returns an empty object, the export that gets later overwritten by the module.exports =
assignment in components/index.js
. Use dependency injection instead.– Bergi
Nov 11 at 17:38
What is dependency injection? @Bergi
– Matt X
Nov 11 at 17:41
What is dependency injection? @Bergi
– Matt X
Nov 11 at 17:41
add a comment |
1 Answer
1
active
oldest
votes
You just built up a "circular dependency". /components/windows/
requires /components/
, which requires /components/windows/
, which requires ...
To resolve those nevertheless, NodeJS initializes the exports to an empty object and rewrites them to the exports
object after the module initialized. Therefore you can access /components/windows
from inside /components/
but not the other way round.
To remove the circular dependency, move foo
to another file that you require in both modules.
so, does it make sense to movefoo
intowindows/
?
– Matt X
Nov 11 at 17:43
@matt yes it would.
– Jonas Wilms
Nov 11 at 17:43
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53251361%2ffolders-as-modules-within-folders-as-modules-nodejs%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You just built up a "circular dependency". /components/windows/
requires /components/
, which requires /components/windows/
, which requires ...
To resolve those nevertheless, NodeJS initializes the exports to an empty object and rewrites them to the exports
object after the module initialized. Therefore you can access /components/windows
from inside /components/
but not the other way round.
To remove the circular dependency, move foo
to another file that you require in both modules.
so, does it make sense to movefoo
intowindows/
?
– Matt X
Nov 11 at 17:43
@matt yes it would.
– Jonas Wilms
Nov 11 at 17:43
add a comment |
You just built up a "circular dependency". /components/windows/
requires /components/
, which requires /components/windows/
, which requires ...
To resolve those nevertheless, NodeJS initializes the exports to an empty object and rewrites them to the exports
object after the module initialized. Therefore you can access /components/windows
from inside /components/
but not the other way round.
To remove the circular dependency, move foo
to another file that you require in both modules.
so, does it make sense to movefoo
intowindows/
?
– Matt X
Nov 11 at 17:43
@matt yes it would.
– Jonas Wilms
Nov 11 at 17:43
add a comment |
You just built up a "circular dependency". /components/windows/
requires /components/
, which requires /components/windows/
, which requires ...
To resolve those nevertheless, NodeJS initializes the exports to an empty object and rewrites them to the exports
object after the module initialized. Therefore you can access /components/windows
from inside /components/
but not the other way round.
To remove the circular dependency, move foo
to another file that you require in both modules.
You just built up a "circular dependency". /components/windows/
requires /components/
, which requires /components/windows/
, which requires ...
To resolve those nevertheless, NodeJS initializes the exports to an empty object and rewrites them to the exports
object after the module initialized. Therefore you can access /components/windows
from inside /components/
but not the other way round.
To remove the circular dependency, move foo
to another file that you require in both modules.
answered Nov 11 at 17:40
Jonas Wilms
54.8k42749
54.8k42749
so, does it make sense to movefoo
intowindows/
?
– Matt X
Nov 11 at 17:43
@matt yes it would.
– Jonas Wilms
Nov 11 at 17:43
add a comment |
so, does it make sense to movefoo
intowindows/
?
– Matt X
Nov 11 at 17:43
@matt yes it would.
– Jonas Wilms
Nov 11 at 17:43
so, does it make sense to move
foo
into windows/
?– Matt X
Nov 11 at 17:43
so, does it make sense to move
foo
into windows/
?– Matt X
Nov 11 at 17:43
@matt yes it would.
– Jonas Wilms
Nov 11 at 17:43
@matt yes it would.
– Jonas Wilms
Nov 11 at 17:43
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53251361%2ffolders-as-modules-within-folders-as-modules-nodejs%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
You have a circular dependency, that's what doesn't work.
require("./..")
returns an empty object, the export that gets later overwritten by themodule.exports =
assignment incomponents/index.js
. Use dependency injection instead.– Bergi
Nov 11 at 17:38
What is dependency injection? @Bergi
– Matt X
Nov 11 at 17:41