Was ist dieses Javascript "erfordern"?

505

Ich versuche, Javascript zum Lesen / Schreiben in eine PostgreSQL-Datenbank zu bringen. Ich habe dieses Projekt auf Github gefunden. Ich konnte den folgenden Beispielcode für die Ausführung im Knoten erhalten.

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 zum Laufen zu bringen, aber es schien nichts zu passieren. Ich habe in der Javascript-Konsole nachgesehen und es steht nur "erforderlich nicht definiert".

Also, was ist das "erfordern"? Warum funktioniert es im Knoten, aber nicht auf einer Webseite?

Bevor ich es in Node zum Laufen bringen konnte, musste ich es auch tun npm install pg. Um was geht es? Ich habe im Verzeichnis gesucht und keine Datei gefunden. Wo hat es hingelegt und wie findet Javascript es?

Neuromant
quelle
45
require ist nicht Teil von Javascript, sondern ein Schlüsselwort, das in nodejs verwendet wird. nodejs ist nicht das DOM, das Sie clientseitig verwenden. Daher funktioniert ein Skript, das möglicherweise mit nodejs funktioniert, möglicherweise nicht im Browser. Können Sie Fenster oder Dokument in nodejs aufrufen? Nein, auch für den Browser erforderlich.
mpm
8
Wie ändere ich den obigen Code, damit er in einem Browser funktioniert?
Neuromancer
8
Sie können nicht direkt von einer Webseite aus mit Pg sprechen. Sie müssen in der Lage sein, einen einfachen TCP / IP-Socket zu öffnen, über den Sie Binärdaten senden und empfangen können, und kein Webbrowser lässt Sie dies zu. Die Bibliothek, auf die Sie sich beziehen, ist eine Erweiterung für node.js und funktioniert nicht in Client-JavaScript. Ich empfehle dringend, dass Sie vom Client aus über Ihren Webserver und JSON-Anfragen / -Antworten mit Ihrem PostgreSQL-Server sprechen.
Craig Ringer
1
Ich führe PostgreSQL lokal aus. Was muss ich für einen Webserver installieren?
Neuromancer
1
Knoten? Es ist ein ziemlich guter Webserver oder kann einer sein, der lokal installiert wird.
Timothy Meade

Antworten:

872

Also, was ist das "erfordern"?

require()ist nicht Teil der Standard-JavaScript-API. In Node.js handelt es sich jedoch um eine integrierte Funktion mit einem besonderen Zweck: dem Laden von Modulen .

Module sind eine Möglichkeit, eine Anwendung in separate Dateien aufzuteilen, anstatt Ihre gesamte Anwendung in einer Datei zu haben. Dieses Konzept ist auch in anderen Sprachen mit geringfügigen Unterschieden in Syntax und Verhalten vorhanden, wie z. B. Cs include, Pythons importusw.

Ein großer Unterschied zwischen Node.js-Modulen und Browser-JavaScript besteht darin, wie auf den Code eines Skripts über den Code eines anderen Skripts zugegriffen wird.

  • In Browser-JavaScript werden Skripte über das <script>Element hinzugefügt . Bei der Ausführung haben alle direkten Zugriff auf den globalen Bereich, einen "gemeinsam genutzten Bereich" zwischen allen Skripten. Jedes Skript kann alles im globalen Bereich frei definieren / ändern / entfernen / aufrufen.

  • In Node.js hat jedes Modul seinen eigenen Bereich. Ein Modul kann nicht direkt auf Dinge zugreifen, die in einem anderen Modul definiert sind, es sei denn, es macht sie verfügbar. Um Dinge aus einem Modul verfügbar zu machen, müssen sie exportsoder zugewiesen werden module.exports. Damit ein Modul auf das exportsoder eines anderen Moduls zugreifen kann module.exports, muss es verwendet werdenrequire() .

Lädt in Ihren Code var pg = require('pg');diepg Modul, einen PostgreSQL-Client für Node.js. Auf diese Weise kann Ihr Code über die pgVariable auf die Funktionen der APIs des PostgreSQL-Clients zugreifen .

Warum funktioniert es im Knoten, aber nicht auf einer Webseite?

require(), module.exportsundexports sind APIs ein Modulsystem , das spezifisch für Node.js. ist Browser implementieren dieses Modulsystem nicht.

Bevor ich es in Node zum Laufen bringen konnte, musste ich es auch tun npm install pg. Um was geht es?

NPM ist ein Paket-Repository-Dienst, der veröffentlichte JavaScript-Module hostet.npm installist ein Befehl, mit dem Sie Pakete aus ihrem Repository herunterladen können.

Wo hat es hingelegt und wie findet Javascript es?

Die npm-CLI legt alle heruntergeladenen Module in einem node_modulesVerzeichnis ab, in dem Sie ausgeführt haben npm install. Node.js enthält eine sehr detaillierte Dokumentation darüber, wie Module andere Module finden , einschließlich der Suche nach einem node_modulesVerzeichnis.

Joseph
quelle
2
Warum sollte Node.js diese Funktionalität benötigen?
Melab
23
@Melab Da eine Modularisierung erforderlich ist, sobald der Code zu etwas Größerem als einer Universitätscodierungsübung aufsteigt und mehr als eine Person einbezieht. Welches ist , warum wir haben mit ihnen seit, wie, für immer .
David Tonhofer
3
Das Äquivalent in PHP wäre include/require[_once]( php.net link ), nicht use, was ein Aliasing- Schlüsselwort ist.
Nevvermind
107

Okay, beginnen wir also mit der Unterscheidung zwischen Javascript in einem Webbrowser und Javascript auf einem Server (CommonJS und Node).

Javascript ist eine Sprache, die traditionell auf einen Webbrowser mit einem begrenzten globalen Kontext beschränkt ist, der hauptsächlich durch das sogenannte DOM-Level 0 (Document Object Model) (die Netscape Navigator-Javascript-API) definiert wird.

Serverseitiges Javascript beseitigt diese Einschränkung und ermöglicht es Javascript, verschiedene Teile des nativen Codes (wie die Postgres-Bibliothek) aufzurufen und Sockets zu öffnen.

Jetzt require()ist ein spezieller Funktionsaufruf als Teil der CommonJS-Spezifikation definiert. Im Knoten werden Bibliotheken und Module im Knotensuchpfad aufgelöst, der jetzt normalerweise als definiert istnode_modules im selben Verzeichnis (oder im Verzeichnis der aufgerufenen Javascript-Datei) oder im systemweiten Suchpfad definiert ist.

Um den Rest Ihrer Frage zu beantworten, müssen wir einen Proxy zwischen dem im Browser ausgeführten Code und dem Datenbankserver verwenden.

Da es sich um Node handelt und Sie bereits wissen, wie eine Abfrage von dort aus ausgeführt wird, ist es sinnvoll, Node als Proxy zu verwenden.

Als einfaches Beispiel erstellen wir eine URL, die einige Fakten über einen Beatle mit einem Namen als JSON zurückgibt.

/* your connection code */

var express = require('express');
var app = express.createServer();
app.get('/beatles/:name', function(req, res) {
    var name = req.params.name || '';
    name = name.replace(/[^a-zA_Z]/, '');
    if (!name.length) {
        res.send({});
    } else {
        var query = client.query('SELECT * FROM BEATLES WHERE name =\''+name+'\' LIMIT 1');
        var data = {};
        query.on('row', function(row) {
            data = row;
            res.send(data);
        });
    };
});
app.listen(80, '127.0.0.1');
Timothy Meade
quelle
2
Es ist verwirrend ... die Methode createServerist verwirrend ... es deutet darauf hin, dass ich jederzeit Server erstellen kann, wann immer ich will ... im Gegensatz zu meinem WAMP-Paradigma: Vor ungefähr 5 Jahren habe ich installiert (z. B. "erstellt" ') ein Server auf meinem Windows XP-Laptop, und ich habe seitdem nie mehr einen anderen Server' erstellt '... jetzt kann ich plötzlich einfach anfangen, Server zu erstellen ... es ist verwirrend ..
dsdsdsdsd
und was ist 'express' ... wenn ich nach C:\Program Files\nodejs\ einer Datei oder einem Verzeichnis mit dem Namen suche express, bekomme ich keine Übereinstimmung ... also woher kommt es ...
dsdsdsdsd
1
Express ist eine Sammlung von Middleware und Framework, die das Erstellen eines Webservers in node.js vereinfacht. Sie müssen ihn installieren npm. Weitere Informationen finden Sie hier: expressjs.com
Timothy Meade
Das ist eine sehr gute Erklärung. Ich habe eine Frage, erfordert die Arbeit mit dynamischen Pfaden in beiden Umgebungen NodeJS und Browser?
M.Abulsoud
29

Es wird zum Laden von Modulen verwendet. Verwenden wir ein einfaches Beispiel.

In Datei circle_object.js:

var Circle = function (radius) {
    this.radius = radius
}
Circle.PI = 3.14

Circle.prototype = {
    area: function () {
        return Circle.PI * this.radius * this.radius;
    }
}

Wir können dies verwenden über require, wie:

node> require('circle_object')
{}
node> Circle
{ [Function] PI: 3.14 }
node> var c = new Circle(3)
{ radius: 3 }
node> c.area()

Die require()Methode wird zum Laden und Zwischenspeichern von JavaScript-Modulen verwendet. Wenn Sie also ein lokales, relatives JavaScript-Modul in eine Node.js-Anwendung laden möchten, können Sie einfach das verwendenrequire() Methode verwenden.

Beispiel:

var yourModule = require( "your_module_name" ); //.js file extension is optional
Sudhir Bastakoti
quelle
9
Was ist, wenn Sie versuchen, es auf einer Webseite zu verwenden?
Neuromancer
1
Ich versuche, das oben Genannte auf eine Webseite zu laden!
Neuromancer
7
Soll sich der erste Codeblock in einer Datei mit dem Namen circle_object.js befinden?
user1416227
24

Ich bemerkte, dass die anderen Antworten zwar erklärten, was erforderlich ist und dass sie zum Laden von Modulen in Node verwendet werden, sie jedoch keine vollständige Antwort zum Laden von Knotenmodulen gaben, wenn sie im Browser arbeiteten.

Das ist ganz einfach. Installieren Sie Ihr Modul mit npm, wie Sie es beschreiben, und das Modul selbst befindet sich in einem Ordner, der normalerweise als node_modules bezeichnet wird.

Der einfachste Weg, es in Ihre App zu laden, besteht darin, es aus Ihrem HTML-Code mit einem Skript-Tag zu referenzieren, das auf dieses Verzeichnis verweist. Wenn sich Ihr node_modules-Verzeichnis im Stammverzeichnis des Projekts auf derselben Ebene wie Ihre index.html befindet, schreiben Sie dies in Ihre index.html:

<script src="node_modules/ng"></script>

Das gesamte Skript wird nun in die Seite geladen, sodass Sie direkt auf die Variablen und Methoden zugreifen können.

Es gibt andere Ansätze, die in größeren Projekten häufiger verwendet werden, z. B. ein Modullader wie require.js . Von den beiden habe ich Require selbst nicht verwendet, aber ich denke, es wird von vielen Menschen als der richtige Weg angesehen.

Sam Redway
quelle
Sie müssen lediglich zum Stammverzeichnis Ihres Projektordners gehen und npm install <Name des Moduls> eingeben. Wenn Sie beispielsweise npm install bootstrap eingeben, wird bootstrap in einem Verzeichnis namens node_modules / bootstrap installiert. Und Sie können jetzt Bootstrap wie oben beschrieben in Ihre App laden. Sie müssen Node und Npm installiert haben, um es offensichtlich verwenden zu können. Wenn Sie weitere Informationen benötigen, geben Sie bitte den Fehler an, den Sie erhalten.
Sam Redway
<name of module>? Hier ist meine Verzeichnisstruktur. Stammordner ist xyz. xyz/index.htmlverweist auf die xyz/js/scripts.jsVerwendung script tag. xyz/js/scripts.jshat Code require('./module1.js');require('./module2.js');. module1.jsIch module2.jsbin auch im xyz/jsOrdner. Wie stelle ich nun den scripts.jsBrowser zur Verfügung?
Überaustausch
16

Sie wissen, wie Sie beim Ausführen von JavaScript im Browser auf Variablen wie "Fenster" oder Mathematik zugreifen können? Sie müssen diese Variablen nicht deklarieren, sie wurden so geschrieben, dass Sie sie verwenden können, wann immer Sie möchten.

Wenn Sie eine Datei in der Node.js-Umgebung ausführen, können Sie eine Variable verwenden. Es heißt "Modul". Es ist ein Objekt. Es hat eine Eigenschaft namens "Exporte". Und es funktioniert so:

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

example.js

module.exports = "some code";

Nun möchten Sie diese Zeichenfolge "etwas Code" in einer anderen Datei.

Wir werden die andere Datei otherFile.js benennen

In diese Datei schreiben Sie:

otherFile.js

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

Diese require () - Anweisung geht zu der Datei, die Sie darin abgelegt haben, und findet alle Daten, die in der Eigenschaft module.exports gespeichert sind. Der Teil let str = ... Ihres Codes bedeutet, dass alles, was eine Anweisung zurückgibt, in der Variablen str gespeichert wird.

In diesem Beispiel ist das Endergebnis, dass Sie in otherFile.js jetzt Folgendes haben:

let string = "irgendein Code";

  • oder -

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

Hinweis:

Der Dateiname, der in die require-Anweisung geschrieben wird: Wenn es sich um eine lokale Datei handelt, sollte dies der Dateipfad zu example.js sein. Außerdem wird die Erweiterung .js standardmäßig hinzugefügt, sodass ich sie nicht schreiben musste.

Ähnliches tun Sie, wenn Sie node.js-Bibliotheken wie Express benötigen. In der Datei express.js befindet sich ein Objekt mit dem Namen 'module' und einer Eigenschaft mit dem Namen 'export'.

Es sieht also ungefähr so ​​aus, unter der Haube (ich bin ein bisschen ein Anfänger, daher sind einige dieser Details möglicherweise nicht genau, aber es soll das Konzept 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 folgendermaßen aus: const moduleName = require ("Modulname");

Wenn Sie eine lokale Datei benötigen, sieht dies folgendermaßen aus: const localFile = require ("./ path / to / local-file");

(Beachten Sie die ./ am Anfang des Dateinamens)


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

Maiya
quelle
6

Zwei Varianten von module.exports / erfordern:

(siehe hier )

Flavour 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));

Flavour 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();
Mike Nagetier
quelle