87

When I do:

lib = require('lib.js')(app)

is app actually geting passed in?

in lib.js:

exports = module.exports = function(app){}

Seems like no, since when I try to do more than just (app) and instead do:

lib = require('lib.js')(app, param2)

And:

exports = module.exports = function(app, param2){}

I don't get params2.

I've tried to debug by doing:

params = {}
params.app = app
params.param2 = "test"

lib = require("lib.js")(params)

but in lib.js when I try to JSON.stringify I get this error:

"DEBUG: TypeError: Converting circular structure to JSON"
2
  • What are the variables you're passing in? Are they declared and defined? Commented Sep 9, 2011 at 21:55
  • Did u figure this out? Likely a spelling error like in your description. "params?2" Commented Jun 3, 2018 at 5:34

2 Answers 2

130

When you call lib = require("lib.js")(params)

You're actually calling lib.js with one parameter containing two properties name app and param2

You either want

// somefile
require("lib.js")(params);
// lib.js
module.exports = function(options) {
  var app = options.app;
  var param2 = options.param2;
};

or

// somefile
require("lib.js")(app, param2)
// lib.js
module.exports = function(app, param2) { }
Sign up to request clarification or add additional context in comments.

3 Comments

+1 for answering the part that the OP added in after my answer :\
@JimSchubert sorry mr schubert :(
And then to have actual exports from my nodejs code I have module.exports = function(options) { ....; return { fn1, fn2 }}; This works though is there a better way?
21

You may have an undefined value that you're trying to pass in.

Take for instance, requires.js:

module.exports = exports = function() {
   console.log('arguments: %j\n', arguments);
};

When you call it correctly, it works:

node
> var requires = require('./requires')(0,1,2,3,4,5);
arguments: {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5}

If you have a syntax error, it fails:

> var requires = require('./requires')(0,);
... var requires = require('./requires')(0,2);
... 

If you have an undefined object, it doesn't work:

> var requires = require('./requires')(0, undefined);
arguments: {"0":0}

So, I'd first check to see that your object is defined properly (and spelled properly when you pass it in), then check that you don't have syntax errors.

6 Comments

Thank you. My mistake was that I forgot to change the number of arguments for one of the calls.
Now I understand how this works a bit better. My remaining question is now about the JSON error. Do most people just debug through the browser?
As far as I know, most people use util.inspect to inspect objects (this is done internally with console.log). You can also use node-inspector (see article for video tutorial). node-inspector is the webkit inspector (like CTRL+SHIFT+J in Chrome) which listens to node --debug.
@SohailSi This is a way to prevent any programmatic errors (like if someone binds a new object to both exports and module.exports). See stackoverflow.com/a/13622513/151445 for more details.
Thank you @JimSchubert for the educational comment.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.