Wie verwende ich eine globale Variable in node.js?


78

Zum Beispiel möchte ich einen benutzerdefinierten Logger verwenden:

logger = require('basic-logger'),
logger.setLevel('info')

var customConfig = {
showMillis: true,
showTimestamp: true
}

var log = new logger(customConfig)

Wie verwende ich diesen Logger in anderen Modulen anstelle von console.log?




1
ZuglobalGLOBAL
Ihrer Information

Antworten:


115

Die meisten Menschen raten von der Verwendung globaler Variablen ab. Wenn Sie dieselbe Logger-Klasse in verschiedenen Modulen möchten, können Sie dies tun

logger.js

  module.exports = new logger(customConfig);

foobar.js

  var logger = require('./logger');
  logger('barfoo');

Wenn Sie eine globale Variable möchten, können Sie Folgendes tun:

global.logger = new logger(customConfig);

28
Verwenden Sie KEINE globalen Variablen! Wenn Sie Ihre Anwendung mit mehreren Prozessen ausführen, werden Sie sehr schlecht geschraubt.
TheHippo

30
TheHippo, globale Variablen sind in einigen Fällen auch bei mehreren Prozessen in Ordnung. Ein Logger hat beispielsweise keine Probleme, wenn mehrere Prozesse eine eigene Instanz des Logger-Objekts haben.
d512

140
Es ist mir langweilig, Kommentare zu "Verwenden Sie keine Globals" zu sehen. In einigen Fällen sind Globals die einzigartige Arbeitsweise. Ich verwende es häufig, um konstante Werte wie "global.email = 'contact@domain.com'" zu speichern und es für mein gesamtes Projekt zu verwenden. Wenn ich es morgen im gesamten Projekt ändern möchte, muss ich es nur in der app.js ändern (in diesem Fall Knotenbeispiel). Ich kenne keinen anderen Weg, dies in Node zu tun, als global zu verwenden. Sagen Sie also bitte nicht kategorisch "Verwenden Sie keine globalen Variablen", sondern nur "Seien Sie weise, wenn Sie Globale verwenden".
Eagle

36
@Eagle Ich verstehe nicht wirklich, warum Sie keine Konfigurationsdatei importieren können, die Ihre E-Mail-Variable definiert.
Pickels

28
Ich kann, aber bei meiner Beschwerde geht es nicht darum, ob ich eine Konfigurationsdatei verwenden kann, sondern darum, ob ich globale Variablen auf sichere Weise verwenden kann oder nicht. Und ich kann.
Eagle

49
global.myNumber; //Delclaration of the global variable - undefined
global.myNumber = 5; //Global variable initialized to value 5. 
var myNumberSquared = global.myNumber * global.myNumber; //Using the global variable. 

Node.js unterscheidet sich von clientseitigem JavaScript in Bezug auf globale Variablen. Nur weil Sie das Wort var oben in Ihrem Node.js-Skript verwenden, bedeutet dies nicht, dass alle benötigten Objekte wie Ihr 'Basic-Logger' auf die Variable zugreifen können.

Um etwas global zu machen, setzen Sie einfach das Wort global und einen Punkt vor den Namen der Variablen. Wenn ich also möchte, dass company_id global ist, nenne ich es global.company_id. Aber seien Sie vorsichtig, global.company_id und company_id sind dasselbe. Benennen Sie globale Variablen also nicht wie andere Variablen in einem anderen Skript - jedes andere Skript, das auf Ihrem Server oder an einer anderen Stelle im selben Code ausgeführt wird .


1
Dies ist anders, da jede Datei / jedes Modul zum Zeitpunkt der Erstellung implizit in ein IIFE eingeschlossen ist, sodass vars tatsächlich lokal für das IIFE sind.
Superluminary

28

Sie können es mit global oder GLOBAL definieren. nodejs unterstützt beide.

für zB

global.underscore = require("underscore");

oder

GLOBAL.underscore = require("underscore");

22

Ich würde jedes Mal vorschlagen, wenn die globale Prüfung verwendet wird, wenn die Variable bereits durch einfaches Prüfen definiert ist

if (!global.logger){
  global.logger = require('my_logger');
}

Ich habe festgestellt, dass es eine bessere Leistung hat


@ wiktus239 Es ist eine Überprüfung, da das Modul nicht erneut geladen werden muss - also bessere Leistung.
Suprxd

1
Die Antwort ist in Ordnung und ifkann verwendet werden, um das Globale nicht unnötig neu zu definieren, aber ich möchte darauf hinweisen, dass requirenichts mehr als einmal geladen wird. Es lädt alles einmal und speichert das Ergebnis zwischen. Das ifist also nicht erforderlich, um das Parsen und Laden von Modulen zu vermeiden, aber es ist nützlich, zu vermeiden, dass der Wert aus dem Cache immer wieder neu zugewiesen wird.
rsp

6

Globale Variablen können in Node verwendet werden, wenn sie mit Bedacht verwendet werden .

Deklaration globaler Variablen im Knoten:

a = 10;
GLOBAL.a = 10;
global.a = 10;

Alle oben genannten Befehle haben dieselben Aktionen mit unterschiedlichen Syntaxen.

Verwenden Sie globale Variablen, wenn sie nicht geändert werden sollen

Hier ein Beispiel für etwas, das bei der Verwendung globaler Variablen passieren kann:

// app.js
a = 10; // no var or let or const means global

// users.js
app.get("/users", (req, res, next) => {
   res.send(a); // 10;
});

// permissions.js
app.get("/permissions", (req, res, next) => {
   a = 11; // notice that there is no previous declaration of a in the permissions.js, means we looking for the global instance of a.
   res.send(a); // 11;
});

Erklärt:

Führen Sie die Benutzerroute zuerst aus und erhalten Sie 10;

Führen Sie dann die Berechtigungsroute aus und erhalten Sie 11;

Führen Sie dann die Benutzerroute erneut aus und erhalten Sie statt 10 auch 11;

Globale Variablen können überholt werden!

Denken Sie jetzt darüber nach, das Express- und Resignin-Res-Objekt als global zu verwenden. Am Ende wird ein asynchroner Fehler beschädigt und der Server wird heruntergefahren.

Wann werden globale Variablen verwendet?

Wie gesagt - wenn var nicht geändert werden soll. Auf jeden Fall wird empfohlen, das process.envObjekt aus der Konfigurationsdatei zu verwenden.


4

Möglicherweise ist es besser, die folgende ifAussage zu vermeiden :

global.logger || (global.logger = require('my_logger'));

5
global.logger = global.logger || require('my_logger')
Jake Wilson

3

Wenn Ihre App in TypeScript geschrieben ist, versuchen Sie es

(global as any).logger = // ...

oder

Object.assign(global, { logger: // ... })

Ich werde es jedoch nur tun, wenn React Native __DEV__in einer Testumgebung ist.

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.