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"

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) { }

+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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.