Globale Objekte in Node.js
In JavaScript gibt es ein spezielles Objekt, das Global Object genannt wird. Auf es und alle seine Eigenschaften kann überall im Programm zugegriffen werden, d. h. globale Variablen.
In Browser-JavaScript ist window normalerweise das globale Objekt, während in Node.js das globale Objekt global ist. Alle globalen Variablen (außer global selbst) sind Eigenschaften des globalen Objekts.
In Node.js können wir direkt auf die Eigenschaften von global zugreifen, ohne es in die Anwendung einbinden zu müssen.
Globale Objekte und globale Variablen
Die grundlegendste Rolle von global ist es, als Host für globale Variablen zu dienen. Gemäß der ECMAScript-Definition sind Variablen, die die folgenden Bedingungen erfüllen, globale Variablen:
- Variablen, die auf der äußersten Ebene definiert sind;
- Eigenschaften des globalen Objekts;
- Implizit definierte Variablen (Variablen, die direkt ohne Definition zugewiesen werden).
Wenn Sie eine globale Variable definieren, wird diese Variable auch eine Eigenschaft des globalen Objekts und umgekehrt. Es ist zu beachten, dass Sie in Node.js keine Variablen auf der äußersten Ebene definieren können, da der gesamte Benutzercode zum aktuellen Modul gehört und das Modul selbst nicht der äußerste Kontext ist.
Hinweis:Es ist am besten, var nicht zum Definieren von Variablen zu verwenden, um die Einführung globaler Variablen zu vermeiden, da globale Variablen den Namensraum verschmutzen und das Kopplungsrisiko des Codes erhöhen.
__filename
__filenameGibt den Dateinamen des aktuell ausgeführten Skripts an. Er gibt den absoluten Pfad des Speicherorts der Datei aus, und er stimmt möglicherweise nicht mit dem Dateinamen überein, der durch die Kommandozeilenargumente angegeben wurde. Wenn er sich in einem Modul befindet, ist der zurückgegebene Wert der Pfad der Moduldatei.
Beispiel
Erstellen Sie eine Datei main.js mit folgendem Code:
// 输出全局变量 __filename 的值 console.log( __filename );
Führen Sie die Datei main.js aus, der Code lautet wie folgt:
$ node main.js /web/com/example/nodejs/main.js
__dirname
__dirnameGibt das Verzeichnis an, in dem sich das aktuell ausgeführte Skript befindet.
Beispiel
Erstellen Sie eine Datei main.js mit folgendem Code:
// 输出全局变量 __dirname 的值 console.log( __dirname );
Führen Sie die Datei main.js aus, der Code lautet wie folgt:
$ node main.js /web/com/example/nodejs
setTimeout(cb, ms)
setTimeout(cb, ms)Die globale Funktion führt die angegebene Funktion (cb) nach der angegebenen Anzahl von Millisekunden (ms) aus. setTimeout() führt die angegebene Funktion nur einmal aus.
Gibt einen Handle-Wert zurück, der den Timer repräsentiert.
Beispiel
Erstellen Sie eine Datei main.js mit folgendem Code:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setTimeout(printHello, 2000);
Führen Sie die Datei main.js aus, der Code lautet wie folgt:
$ node main.js Hello, World!
clearTimeout(t)
clearTimeout( t )Die globale Funktion wird verwendet, um einen zuvor durch setTimeout() erstellten Timer zu stoppen. Der Parametertist der von der Funktion setTimeout() erstellte Timer.
Beispiel
Erstellen Sie eine Datei main.js mit folgendem Code:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
var t = setTimeout(printHello, 2000);
// 清除定时器
clearTimeout(t);
Führen Sie die Datei main.js aus, der Code lautet wie folgt:
$ node main.js
setInterval(cb, ms)
setInterval(cb, ms)Die globale Funktion führt die angegebene Funktion (cb) nach der angegebenen Anzahl von Millisekunden (ms) aus.
Gibt einen Handle-Wert zurück, der den Timer repräsentiert. Sie können die FunktionclearInterval(t)verwenden, um den Timer zu löschen.
Die Methode setInterval() ruft die Funktion kontinuierlich auf, bis clearInterval() aufgerufen wird oder das Fenster geschlossen wird.
Beispiel
Erstellen Sie eine Datei main.js mit folgendem Code:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setInterval(printHello, 2000);
Führen Sie die Datei main.js aus, der Code lautet wie folgt:
$ node main.jsHello, World! Hello, World! Hello, World! Hello, World! Hello, World! ……
Das obige Programm gibt alle zwei Sekunden "Hello, World!" aus und wird endlos weiter ausgeführt, bis Siectrl + cdie Tastenkombination drücken.
⟦0⟧
console wird verwendet, um eine Standard-Konsolenausgabe bereitzustellen. Es ist ein Debugging-Tool, das von der JScript-Engine des Internet Explorers bereitgestellt wurde und später allmählich zum Implementierungsstandard für Browser wurde.
Node.js folgt diesem Standard und stellt ein console-Objekt bereit, das mit dem üblichen Verhalten übereinstimmt und verwendet wird, um Zeichen an den Standardausgabestream (stdout) oder den Standardfehlerstream (stderr) auszugeben.
console-Methoden
Im Folgenden werden die Methoden des console-Objekts aufgeführt:
| Nein. | Methode & Beschreibung |
|---|---|
| 1 | console.log([data][, ...]) Gibt Zeichen an den Standardausgabestream aus und endet mit einem Zeilenumbruch. Diese Methode akzeptiert mehrere Parameter. Wenn es nur einen Parameter gibt, gibt sie die Zeichenkettenform dieses Parameters aus. Wenn es mehrere Parameter gibt, gibt sie diese in einem Format aus, das dem printf()-Befehl der Programmiersprache C ähnelt. |
| 2 | console.info([data][, ...]) Dieser Befehl wird verwendet, um eine informative Nachricht zurückzugeben. Dieser Befehl unterscheidet sich nicht viel von console.log, außer dass er in Chrome nur Text ausgibt, während er in anderen ein blaues Ausrufezeichen anzeigt. |
| 3 | console.error([data][, ...]) Gibt Fehlermeldungen aus. Wenn ein Fehler auftritt, zeigt die Konsole ein rotes Kreuz an. |
| 4 | console.warn([data][, ...]) Gibt Warnmeldungen aus. Die Konsole zeigt ein gelbes Ausrufezeichen an. |
| 5 | console.dir(obj[, options]) Wird verwendet, um ein Objekt zu inspizieren und es in einem leicht lesbaren und druckbaren Format anzuzeigen. |
| 6 | console.time(label) Gibt die Zeit aus und zeigt den Beginn der Zeitmessung an. |
| 7 | console.timeEnd(label) Beendet die Zeit und zeigt das Ende der Zeitmessung an. |
| 8 | console.trace(message[, ...]) Der Aufrufpfad des aktuell ausgeführten Codes im Stack. Dies ist sehr hilfreich zum Testen der Funktionsausführung; fügen Sie einfach console.trace innerhalb der Funktion hinzu, die Sie testen möchten. |
| 9 | console.assert(value[, message][, ...]) Wird verwendet, um festzustellen, ob ein Ausdruck oder eine Variable true ist. Es akzeptiert zwei Parameter: Der erste ist ein Ausdruck und der zweite ist eine Zeichenkette. Nur wenn der erste Parameter false ist, wird der zweite Parameter ausgegeben; andernfalls gibt es kein Ergebnis. |
console.log akzeptiert mehrere Parameter. Wenn es nur einen Parameter gibt, gibt es die Stringform dieses Parameters aus. Wenn es mehrere Parameter gibt, erfolgt die Ausgabe in einem Format ähnlich dem printf()-Befehl der Programmiersprache C.
Der erste Parameter ist eine Zeichenkette. Wenn keine Parameter vorhanden sind, wird nur ein Zeilenumbruch ausgegeben.
console.log('Hello world');
console.log('byvoid%diovyb');
console.log('byvoid%diovyb', 1991);
Das Ergebnis der Ausführung ist:
Hello world byvoid%diovyb byvoid1991iovyb
- console.error(): Gleiche Verwendung wie console.log(), außer dass die Ausgabe an den Standardfehlerstream erfolgt.
- console.trace(): Gibt den aktuellen Aufrufstack an den Standardfehlerstream aus.
console.trace();
Das Ergebnis der Ausführung ist:
Trace: at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallback (node.js:192:40)
Beispiel
Erstellen Sie eine Datei main.js mit folgendem Code:
console.info("程序开始执行:");
var counter = 10;
console.log("计数: %d", counter);
console.time("获取数据");
//
// 执行一些代码
//
console.timeEnd('获取数据');
console.info("程序执行完毕。")
Führen Sie die Datei main.js aus, der Code lautet wie folgt:
$ node main.js 程序开始执行: 计数: 10 获取数据: 0ms 程序执行完毕
process
process ist eine globale Variable, d. h. eine Eigenschaft des globalen Objekts.
Es ist ein Objekt, das verwendet wird, um den aktuellen Zustand des Node.js-Prozesses zu beschreiben und eine einfache Schnittstelle zum Betriebssystem bereitzustellen. Normalerweise muss man sich damit befassen, wenn man lokale Kommandozeilenprogramme schreibt. Im Folgenden werden einige der am häufigsten verwendeten Member-Methoden des process-Objekts vorgestellt.
| Nein. | Ereignis & Beschreibung |
|---|---|
| 1 | exit Wird ausgelöst, wenn der Prozess kurz vor dem Beenden steht. |
| 2 | beforeExit Dieses Ereignis wird ausgelöst, wenn node die Ereignisschleife leert und keine anderen Vorkehrungen mehr hat. Im Allgemeinen wird node beendet, wenn keine Prozessvorkehrungen mehr vorhanden sind, aber 'beforeExit'-Listener können asynchron aufgerufen werden, sodass node weiter ausgeführt wird. |
| 3 | uncaughtException Wird ausgelöst, wenn eine Ausnahme zur Ereignisschleife zurückgelangt. Wenn ein Listener für die Ausnahme hinzugefügt wurde, erfolgt die Standardoperation (Ausgeben des Stacktrace und Beenden) nicht. |
| 4 | Signalereignis Wird ausgelöst, wenn der Prozess ein Signal empfängt. Für die Signalliste siehe die standardmäßigen POSIX-Signalnamen wie SIGINT, SIGUSR1 usw. |
Beispiel
Erstellen Sie eine Datei main.js mit folgendem Code:
process.on('exit', function(code) {
// 以下代码永远不会执行
setTimeout(function() {
console.log("该代码不会执行");
}, 0);
console.log('退出码为:', code);
});
console.log("程序执行结束");
Führen Sie die Datei main.js aus, der Code lautet wie folgt:
$ node main.js 程序执行结束 退出码为: 0
Exit-Statuscodes
| Statuscode | Name & Beschreibung |
|---|---|
| 1 | Nicht abgefangene schwerwiegende Ausnahme Es liegt eine nicht abgefangene Ausnahme vor, und sie wurde nicht von einer Domain oder einem uncaughtException-Handler behandelt. |
| 2 | Nicht verwendet Reserviert; von Bash für die missbräuchliche Verwendung von Built-ins reserviert. |
| 3 | Interner JavaScript-Parsing-Fehler Ein Parsing-Fehler, der beim Starten des Node-Prozesses mit JavaScript-Quellcode verursacht wird. Sehr selten, tritt nur bei der Entwicklung von Node auf. |
| 4 | Interner JavaScript-Auswertungsfehler Ein Fehler beim Zurückgeben einer Funktion bei der Auswertung von JavaScript-Quellcode zum Starten des Node-Prozesses. Sehr selten, tritt nur bei der Entwicklung von Node auf. |
| 5 | Fataler Fehler Ein fataler und nicht behebbarer Fehler in V8. Wird normalerweise an stderr ausgegeben, mit dem Inhalt: FATAL ERROR. |
| 6 | Interner Ausnahmehandler, der keine Funktion ist Nicht abgefangene Ausnahme, und aus irgendeinem Grund ist die interne Ausnahmehandler-Funktion auf einen Nicht-Funktionswert gesetzt und kann nicht aufgerufen werden. |
| 7 | Laufzeitfehler des internen Ausnahmehandlers Nicht abgefangene Ausnahme, und der Ausnahmehandler selbst hat beim Behandeln eine Ausnahme ausgelöst. Zum Beispiel, wenn process.on('uncaughtException') oder domain.on('error') eine Ausnahme ausgelöst hat. |
| 8 | Nicht verwendet Reserviert. In früheren Versionen von Node.js zeigte Exit-Code 8 manchmal eine nicht abgefangene Ausnahme an. |
| 9 | Ungültiges Argument Möglicherweise wurde ein unbekanntes Argument angegeben, oder das angegebene Argument hatte keinen Wert. |
| 10 | Interner JavaScript-Laufzeitfehler Ein Fehler, der ausgelöst wird, wenn die JavaScript-Quelle den Node-Prozess startet; sehr selten und tritt nur bei der Entwicklung von Node selbst auf. |
| 12 | Ungültiges Debug-Argument Die Option --debug und/oder --debug-brk wurde gesetzt, aber ein falscher Port wurde gewählt. |
| 128 | Signalbeendigungen Wenn Node ein fatales Signal wie SIGKILL oder SIGHUP empfängt, dann ist der Exit-Code 128 plus der Signalcode. Dies ist übliche Unix-Praxis, wobei der Exit-Signalcode in die höherwertigen Bits gesetzt wird. |
Prozesseigenschaften
Process bietet viele nützliche Eigenschaften, die uns helfen, die Systeminteraktion besser zu steuern:
| Nein. | Eigenschaft & Beschreibung |
|---|---|
| 1 | stdout Standardausgabestream. |
| 2 | stderr Standardfehlerstream. |
| 3 | stdin Standard-Eingabestream. |
| 4 | argv Die Eigenschaft argv gibt ein Array zurück, das aus den verschiedenen Argumenten besteht, wenn das Skript von der Befehlszeile aus ausgeführt wird. Ihr erstes Element ist immer node, das zweite Element ist der Skriptdateiname und die übrigen Elemente sind die Argumente der Skriptdatei. |
| 5 | execPath Gibt den absoluten Pfad der Node-Binärdatei zurück, die das aktuelle Skript ausführt. |
| 6 | execArgv Gibt ein Array zurück, dessen Elemente die Befehlszeilenargumente zwischen der ausführbaren Node-Datei und der Skriptdatei sind, wenn das Skript von der Befehlszeile aus ausgeführt wird. |
| 7 | env Gibt ein Objekt zurück, dessen Elemente die Umgebungsvariablen der aktuellen Shell sind. |
| 8 | exitCode Der Exit-Code beim Beenden des Prozesses. Wenn der Prozess durch process.exit() beendet wird, muss kein Exit-Code angegeben werden. |
| 9 | version Die Version von Node, wie z. B. v0.10.18. |
| 10 | versions Eine Eigenschaft, die die Node-Version und die Abhängigkeiten enthält. |
| 11 | config Ein Objekt, das die JavaScript-Konfigurationsoptionen enthält, die zum Kompilieren der aktuellen Node-Executable verwendet werden. Es entspricht der Datei "config.gypi", die durch Ausführen des Skripts ./configure generiert wird. |
| 12 | pid Die Prozess-ID des aktuellen Prozesses. |
| 13 | title Der Prozessname mit dem Standardwert "node"; dieser Wert kann angepasst werden. |
| 14 | arch Die aktuelle CPU-Architektur: 'arm', 'ia32' oder 'x64'. |
| 15 | Plattform Das Plattformsystem, auf dem das Programm ausgeführt wird: 'darwin', 'freebsd', 'linux', 'sunos' oder 'win32'. |
| 16 | mainModule Eine Alternative zu require.main. Der Unterschied besteht darin, dass require.main weiterhin das alte Modul zurückgeben kann, wenn sich das Hauptmodul zur Laufzeit ändert. Es kann davon ausgegangen werden, dass beide auf dasselbe Modul verweisen. |
Beispiel
Erstellen Sie eine Datei namens main.js mit dem folgenden Code:
// 输出到终端
process.stdout.write("Hello World!" + "\n");
// 通过参数读取
process.argv.forEach(function(val, index, array) {
console.log(index + ': ' + val);
});
// 获取执行路径
console.log(process.execPath);
// 平台信息
console.log(process.platform);
Führen Sie die Datei main.js mit dem folgenden Code aus:
$ node main.js Hello World! 0: node 1: /web/www/node/main.js /usr/local/node/0.10.36/bin/node darwin
Methodenreferenz
Prozess bietet viele nützliche Methoden, mit denen wir die Systeminteraktion besser steuern können:
| Nein. | Methode & Beschreibung |
|---|---|
| 1 | abort() Dies führt dazu, dass Node das abort-Ereignis auslöst. Es führt dazu, dass Node beendet wird und eine Core-Datei erzeugt. |
| 2 | chdir(directory) Ändert das Arbeitsverzeichnis des aktuellen Prozesses; wirft eine Ausnahme, wenn der Vorgang fehlschlägt. |
| 3 | cwd() Gibt das Arbeitsverzeichnis des aktuellen Prozesses zurück. |
| 4 | exit([code]) Beendet den Prozess mit dem angegebenen Code. Wenn er weggelassen wird, wird Code 0 verwendet. |
| 5 | getgid() Ruft die Gruppenidentität des Prozesses ab (siehe getgid(2)). Es wird die numerische Gruppen-ID abgerufen, nicht der Name. Hinweis: Diese Funktion ist nur auf POSIX-Plattformen verfügbar (z. B. Nicht-Windows und Nicht-Android). |
| 6 | setgid(id) Legt die Gruppenidentität des Prozesses fest (siehe setgid(2)). Sie kann eine numerische ID oder einen Gruppennamen akzeptieren. Wenn ein Gruppenname angegeben wird, blockiert sie, während sie darauf wartet, ihn in eine numerische ID aufzulösen. Hinweis: Diese Funktion ist nur auf POSIX-Plattformen verfügbar (z. B. Nicht-Windows und Nicht-Android). |
| 7 | getuid() Ruft die Benutzeridentität des Prozesses ab (siehe getuid(2)). Dies ist die numerische Benutzer-ID, nicht der Benutzername. Hinweis: Diese Funktion ist nur auf POSIX-Plattformen verfügbar (z. B. Nicht-Windows und Nicht-Android). |
| 8 | setuid(id) Legt die Benutzeridentität des Prozesses fest (siehe setuid(2)). Sie akzeptiert eine numerische ID oder einen Zeichenfolgennamen. Wenn ein Gruppenname angegeben wird, blockiert sie, während sie darauf wartet, ihn in eine numerische ID aufzulösen. Hinweis: Diese Funktion ist nur auf POSIX-Plattformen verfügbar (z. B. Nicht-Windows und Nicht-Android). |
| 9 | getgroups() Gibt ein Array der Gruppen-IDs des Prozesses zurück. POSIX-Systeme garantieren deren Vorhandensein nicht, aber node.js garantiert es. Hinweis: Diese Funktion ist nur auf POSIX-Plattformen verfügbar (z. B. Nicht-Windows und Nicht-Android). |
| 10 | setgroups(groups) Legt die Gruppen-IDs des Prozesses fest. Dies ist ein privilegierter Vorgang, daher benötigen Sie Root-Rechte oder die CAP_SETGID-Fähigkeit. Hinweis: Diese Funktion ist nur auf POSIX-Plattformen verfügbar (z. B. Nicht-Windows und Nicht-Android). |
| 11 | initgroups(user, extra_group) Liest /etc/group und initialisiert die Gruppen-Zugriffsliste unter Verwendung aller Gruppen, zu denen das Mitglied gehört. Dies ist ein privilegierter Vorgang, daher benötigen Sie Root-Rechte oder die CAP_SETGID-Fähigkeit. Hinweis: Diese Funktion ist nur auf POSIX-Plattformen verfügbar (z. B. Nicht-Windows und Nicht-Android). |
| 12 | kill(pid[, signal]) Sendet ein Signal an den Prozess. pid ist die Prozess-ID, und signal ist die Zeichenkettenbeschreibung des Signals, das gesendet wird. Signalnamen sind Zeichenketten wie 'SIGINT' oder 'SIGHUP'. Wenn weggelassen, ist das Signal 'SIGTERM'. |
| 13 | memoryUsage() Gibt ein Objekt zurück, das die Speichernutzung des Node-Prozesses in Bytes beschreibt. |
| 14 | nextTick(callback) Ruft die Callback-Funktion auf, sobald die aktuelle Event-Loop endet. |
| 15 | umask([mask]) Setzt oder liest die Dateimaske des Prozesses (umask). Kindprozesse erben die Maske vom Elternprozess. Wenn das Argument mask gültig ist, wird die alte Maske zurückgegeben. Andernfalls wird die aktuelle Maske zurückgegeben. |
| 16 | uptime() Gibt die Anzahl der Sekunden zurück, die Node bereits läuft. |
| 17 | hrtime() Gibt die hochauflösende Zeit des aktuellen Prozesses als Array aus [seconds, nanoseconds] zurück. Sie ist relativ zu einem beliebigen Ereignis in der Vergangenheit. Dieser Wert steht in keinem Zusammenhang mit dem Datum und ist daher nicht von Uhrendrift betroffen. Sein Hauptzweck ist die Messung der Programmleistung durch präzise Zeitintervalle. Das vorherige Ergebnis kann an das aktuelle process.hrtime() übergeben werden, wodurch die Zeitdifferenz zwischen beiden zurückgegeben wird, zum Benchmarking und zur Messung von Zeitintervallen. |
Beispiel
Erstellen Sie eine Datei namens main.js mit dem folgenden Code:
// 输出当前目录
console.log('当前目录: ' + process.cwd());
// 输出当前版本
console.log('当前版本: ' + process.version);
// 输出内存使用情况
console.log(process.memoryUsage());
Führen Sie die Datei main.js mit dem folgenden Code aus:
$ node main.js
当前目录: /web/com/example/nodejs
当前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 } Andere Erweiterungen