721 Stimmen

Was ist dieses JavaScript "require"?

Ich versuche, JavaScript zum Lesen/Schreiben in eine PostgreSQL-Datenbank zu bekommen. Ich fand dies Projekt auf GitHub. Ich konnte den folgenden Beispielcode in Node zum Laufen bringen.

var pg = require('pg'); //native libpq bindings = `var pg = require('pg').native`
var conString = "tcp://postgres:1234@localhost/postgres";

var client = new pg.Client(conString);
client.connect();

//queries are queued and executed one after another once the connection becomes available
client.query("CREATE TEMP TABLE beatles(name varchar(10), height integer, birthday timestamptz)");
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", ['Ringo', 67, new Date(1945, 11, 2)]);
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", ['John', 68, new Date(1944, 10, 13)]);

//queries can be executed either via text/parameter values passed as individual arguments
//or by passing an options object containing text, (optional) parameter values, and (optional) query name
client.query({
  name: 'insert beatle',
  text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)",
  values: ['George', 70, new Date(1946, 02, 14)]
});

//subsequent queries with the same name will be executed without re-parsing the query plan by postgres
client.query({
  name: 'insert beatle',
  values: ['Paul', 63, new Date(1945, 04, 03)]
});
var query = client.query("SELECT * FROM beatles WHERE name = $1", ['John']);

//can stream row results back 1 at a time
query.on('row', function(row) {
  console.log(row);
  console.log("Beatle name: %s", row.name); //Beatle name: John
  console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates
  console.log("Beatle height: %d' %d\"", Math.floor(row.height/12), row.height%12); //integers are returned as javascript ints
});

//fired after last row is emitted
query.on('end', function() { 
  client.end();
});

Als Nächstes habe ich versucht, es auf einer Webseite laufen zu lassen, aber es schien nichts zu passieren. Ich habe in der JavaScript-Konsole nachgesehen, und es heißt nur "require not defined".

Was ist also dieses "erfordern"? Warum funktioniert es in Node, aber nicht in einer Webseite?

Außerdem musste ich, bevor ich es in Node zum Laufen brachte, Folgendes tun npm install pg . Was hat es damit auf sich? Ich habe in dem Verzeichnis nachgesehen und keine Datei pg gefunden. Wo hat es sie abgelegt, und wie findet JavaScript sie?

24voto

Maiya Punkte 912

Sie wissen, dass Sie bei der Ausführung von JavaScript im Browser Zugriff auf Variablen wie "window" oder Math haben? Sie müssen diese Variablen nicht deklarieren, sie wurden für Sie geschrieben, damit Sie sie verwenden können, wann immer Sie wollen.

Nun, wenn Sie eine Datei in der Node.js-Umgebung ausführen, gibt es eine Variable, die Sie verwenden können. Sie heißt "module". Es ist ein Objekt. Es hat eine Eigenschaft namens "exports". Und das funktioniert so:

In eine Datei, die wir example.js nennen werden, schreiben Sie:

beispiel.js

module.exports = "some code";

Nun wollen Sie diese Zeichenfolge "some code" in einer anderen Datei.

Wir werden die andere Datei otherFile.js nennen

In diese Datei schreiben Sie:

otherFile.js

let str = require('./example.js')

Die require()-Anweisung geht zu der von Ihnen angegebenen Datei und findet alle Daten, die in der Eigenschaft module.exports gespeichert sind. Der let str = ... Teil Ihres Codes bedeutet, dass alles, was die require-Anweisung zurückgibt, in der Variablen str gespeichert wird.

Das Endergebnis in diesem Beispiel ist also, dass Sie in otherFile.js jetzt Folgendes haben:

let string = "irgendein Code";

  • oder -

let str = ('./example.js').module.exports

Anmerkung:

der Dateiname, der innerhalb der require-Anweisung geschrieben wird: Wenn es eine lokale Datei ist, sollte es der Dateipfad zu example.js sein. Außerdem wird die Erweiterung .js standardmäßig hinzugefügt, so dass ich sie nicht schreiben musste.

Ähnlich verhält es sich bei der Anforderung von node.js-Bibliotheken, wie z. B. Express. In der Datei express.js gibt es ein Objekt namens "module" mit einer Eigenschaft namens "exports".

Also, es sieht in etwa so aus, unter der Haube (Ich bin ein wenig von einem Anfänger, so dass einige dieser Details vielleicht nicht genau sein, aber es ist das Konzept zu zeigen:

express.js

module.exports = function() {
    //It returns an object with all of the server methods
    return {
        listen: function(port){},
        get: function(route, function(req, res){}){}
     }
}

Wenn Sie ein Modul benötigen, sieht es wie folgt aus: const moduleName = require("module-name");

Wenn Sie eine lokale Datei benötigen, sieht sie wie folgt aus: const localFile = require("./path/to/local-file");

(beachten Sie das ./ am Anfang des Dateinamens)


Beachten Sie auch, dass der Export standardmäßig ein Objekt ist z. B. module.exports = {} Sie können also module.exports.myfunction = () => {} schreiben, bevor Sie der module.exports einen Wert zuweisen. Sie können aber auch das Objekt ersetzen, indem Sie module.exports = "Ich bin kein Objekt mehr." schreiben.

10voto

mike rodent Punkte 12041

Zwei Varianten von module.exports / require:

(siehe aquí )

Geschmacksrichtung 1
Exportdatei (misc.js):

var x = 5;
var addX = function(value) {
  return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

andere Datei:

var misc = require('./misc');
console.log("Adding %d to 10 gives us %d", misc.x, misc.addX(10));

Geschmacksrichtung 2
Exportdatei (user.js):

var User = function(name, email) {
  this.name = name;
  this.email = email;
};
module.exports = User;

andere Datei:

var user = require('./user');
var u = new user();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X