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?
global
GLOBAL
Antworten:
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);
quelle
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 .
quelle
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");
quelle
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
quelle
if
kann verwendet werden, um das Globale nicht unnötig neu zu definieren, aber ich möchte darauf hinweisen, dassrequire
nichts mehr als einmal geladen wird. Es lädt alles einmal und speichert das Ergebnis zwischen. Dasif
ist 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.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.env
Objekt aus der Konfigurationsdatei zu verwenden.quelle
Möglicherweise ist es besser, die folgende
if
Aussage zu vermeiden :global.logger || (global.logger = require('my_logger'));
quelle
global.logger = global.logger || require('my_logger')
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.quelle