it-swarm.com.de

Was ist das Javascript "erforderlich"?

Ich versuche, Javascript zum Lesen/Schreiben in eine PostgreSQL-Datenbank zu bringen. Ich fand dieses Projekt auf Github. Ich konnte den folgenden Beispielcode zum Ausführen in Node abrufen.

var pg = require('pg'); //native libpq bindings = `var pg = require('pg').native`
var conString = "tcp://postgres:[email protected]/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 versuchte ich, es auf einer Webseite laufen zu lassen, aber es schien nichts zu passieren. Ich habe die Javascript-Konsole überprüft und es heißt nur "nicht definiert".

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

Außerdem musste ich npm install pg ausführen, bevor es in node funktioniert. Um was geht es? Ich schaute in das Verzeichnis und fand keine Datei pg. Wo hat es hingelegt und wie findet es Javascript?

427
neuromancer

Also, was ist das "erfordern?"

require() ist nicht Teil der Standard-JavaScript-API. In Node.js ist dies jedoch eine integrierte Funktion mit einem speziellen Zweck: zum 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 gibt es auch in anderen Sprachen mit geringfügigen Unterschieden in Syntax und Verhalten, wie z. B. Cs include, Pythons import und so weiter.

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 Skripts über das Element _<script>_ hinzugefügt. Wenn sie ausgeführt werden, haben sie alle direkten Zugriff auf den globalen Bereich, einen "gemeinsam genutzten Bereich" zwischen allen Skripten. Jedes Skript kann im globalen Bereich beliebig definieren/ändern/entfernen/aufrufen.

  • In Node.js hat jedes Modul einen eigenen Bereich. Ein Modul kann nicht direkt auf in einem anderen Modul definierte Objekte zugreifen, es sei denn, es macht sie verfügbar. Um Dinge aus einem Modul verfügbar zu machen, müssen sie exports oder _module.exports_ zugewiesen werden. Damit ein Modul auf exports oder _module.exports_ eines anderen Moduls zugreifen kann, muss require() verwendet werden.

In Ihrem Code lädt var pg = require('pg'); das Modul pg , einen PostgreSQL-Client für Node.js. Auf diese Weise kann Ihr Code über die Variable pg auf die Funktionen der APIs des PostgreSQL-Clients zugreifen.

Warum funktioniert es in Node, aber nicht auf einer Webseite?

require(), _module.exports_ und exports sind APIs eines für Node.js spezifischen Modulsystems. Browser implementieren dieses Modulsystem nicht.

Außerdem musste ich _npm install pg_ ausführen, bevor es in Node funktioniert. Um was geht es?

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

Wo hat es hingelegt und wie findet es Javascript?

Die npm cli legt alle heruntergeladenen Module in einem _node_modules_ Verzeichnis ab, in dem Sie _npm install_ ausgeführt haben. Node.js enthält eine sehr ausführliche Dokumentation zu wie Module andere Module finden , die das Finden eines _node_modules_ -Verzeichnisses einschließt.

742
Joseph

Also gut, lassen Sie uns zunächst die Unterscheidung zwischen Javascript in einem Webbrowser und Javascript auf einem Server (CommonJS und Node) treffen.

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

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

Nun ist require() ein spezieller Funktionsaufruf, der als Teil der CommonJS-Spezifikation definiert ist. In node werden Bibliotheken und Module im Suchpfad Node aufgelöst, der jetzt normalerweise als node_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 wir uns mit Node befassen und Sie bereits mit dem Ausführen einer Abfrage von dort aus vertraut sind, ist es sinnvoll, Node als diesen Proxy zu verwenden.

Als einfaches Beispiel erstellen wir eine URL, die einige Fakten über einen Beatle mit einem Namen wie 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');
99
Timothy Meade

Es wird zum Laden von Modulen verwendet. Lassen Sie uns ein einfaches Beispiel verwenden.

In der 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 über require verwenden, wie:

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

Die Methode require() 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 die require() -Methode verwenden.

Beispiel:

var yourModule = require( "your_module_name" ); //.js file extension is optional
27

Ich bemerkte, dass die anderen Antworten zwar erklärten, was erforderlich ist, und dass es zum Laden von Modulen in Node verwendet wird, aber keine vollständige Antwort darauf gaben, wie Knotenmodule beim Arbeiten im Browser geladen werden.

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

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, würden Sie dies in Ihre index.html schreiben:

<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 zum Einsatz kommen, z. B. einen Modullader wie require.js . Von den beiden habe ich Require nicht benutzt, aber ich denke, es wird von vielen Leuten als der richtige Weg angesehen.

20
Sam Redway

Sie wissen, wie Sie beim Ausführen von JavaScript im Browser auf Variablen wie "window" oder "Math" zugreifen können? Sie müssen diese Variablen nicht deklarieren, sie wurden geschrieben, damit 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 das funktioniert so:

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

example.js

module.exports = "some code";

Jetzt möchten Sie diese Zeichenfolge "einige 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')

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

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

let string = "etwas Code";

  • oder -

es sei str = ('./example.js').module.exports

Hinweis:

der Dateiname, der in der require-Anweisung geschrieben ist: 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.

Sie tun etwas Ähnliches, wenn Sie knoten.js-Bibliotheken wie Express benötigen. In der Datei express.js befindet sich ein Objekt namens 'module' mit einer Eigenschaft namens 'exports'.

Unter der Haube sieht es also ungefähr so ​​aus (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 ("module-name");

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

(Beachten Sie die ./ am Anfang des Dateinamens)

5
Maiya