Node.js "erfordern" Funktion und Parameter

74

Wenn ich es tue:

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

wird apptatsächlich übergeben?

in lib.js:

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

Scheint nein zu sein, denn wenn ich versuche, mehr als nur zu tun (app)und stattdessen:

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

Und:

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

Ich verstehe nicht params2.

Ich habe versucht zu debuggen, indem ich Folgendes getan habe:

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

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

aber in lib.js, wenn ich versuche, JSON.stringifybekomme ich diesen Fehler:

"DEBUG: TypeError: Converting circular structure to JSON"
user885355
quelle
Welche Variablen übergeben Sie? Sind sie deklariert und definiert?
Samir Talwar
Hast du das herausgefunden? Wahrscheinlich ein Rechtschreibfehler wie in Ihrer Beschreibung. "params? 2"
Mike Mestnik

Antworten:

113

Wenn du anrufst lib = require("lib.js")(params)

Sie rufen tatsächlich lib.jsmit einem Parameter auf, der zwei Eigenschaftsnamen appund enthältparam2

Sie wollen entweder

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

oder

// somefile
require("lib.js")(app, param2)
// lib.js
module.exports = function(app, param2) { }
Raynos
quelle
+1 für die Beantwortung des Teils, den das OP nach meiner Antwort hinzugefügt hat: \
Jim Schubert
@ JimSchubert sorry mr schubert :(
Raynos
Und dann, um tatsächliche Exporte von meinem NodeJS-Code zu haben, die ich habe. module.exports = function(options) { ....; return { fn1, fn2 }}; Dies funktioniert jedoch, gibt es einen besseren Weg?
HankCa
18

Möglicherweise haben Sie einen undefinierten Wert, den Sie übergeben möchten.

Nehmen Sie zum Beispiel requires.js:

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

Wenn Sie es richtig aufrufen, funktioniert es:

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

Wenn Sie einen Syntaxfehler haben, schlägt dieser fehl:

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

Wenn Sie ein undefiniertes Objekt haben, funktioniert es nicht:

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

Ich würde also zuerst überprüfen, ob Ihr Objekt richtig definiert ist (und richtig geschrieben ist, wenn Sie es übergeben), und dann überprüfen, ob Sie keine Syntaxfehler haben.

Jim Schubert
quelle
1
Vielen Dank. Mein Fehler war, dass ich vergessen habe, die Anzahl der Argumente für einen der Aufrufe zu ändern.
user885355
Jetzt verstehe ich, wie das ein bisschen besser funktioniert. Meine verbleibende Frage betrifft jetzt den JSON-Fehler. Debuggen die meisten Leute nur über den Browser?
user885355
Soweit ich weiß, util.inspectinspizieren die meisten Leute Objekte (dies geschieht intern mit console.log). Sie können auch Node-Inspector verwenden (siehe Artikel für das Video-Tutorial). Node-Inspector ist der Webkit-Inspector (wie STRG + UMSCHALT + J in Chrome), der abhört node --debug.
Jim Schubert
1
@SohailSi Dies ist eine Möglichkeit, Programmfehler zu vermeiden (z. B. wenn jemand ein neues Objekt an beide exportsund bindet module.exports). Weitere Informationen finden Sie unter stackoverflow.com/a/13622513/151445 .
Jim Schubert
1
Vielen Dank an @JimSchubert für den pädagogischen Kommentar.
Sohail Si