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.