wake-up-neo.com

Variablen zwischen Dateien in Node.js freigeben?

Hier sind 2 Dateien:

// main.js
require('./modules');
console.log(name); // prints "foobar"

// module.js
name = "foobar";

Wenn ich nicht "var" habe, funktioniert es. Aber wenn ich habe:

// module.js
var name = "foobar";

name wird in main.js nicht definiert.

Ich habe gehört, dass globale Variablen schlecht sind, und Sie sollten "var" vor den Referenzen verwenden. Aber ist dies ein Fall, in dem globale Variablen gut sind?

102

Globale Variablen sind fast nie eine gute Sache (vielleicht ein oder zwei Ausnahmen da draußen ...). In diesem Fall sieht es so aus, als würden Sie wirklich nur Ihre "name" -Variable exportieren. Z.B.,

// module.js
var name = "foobar";
// export it
exports.name = name;

Dann in main.js ...

//main.js
// get a reference to your required module
var myModule = require('./module');

// name is a member of myModule due to the export above
var name = myModule.name;
154
jmar777

Ich kann kein Szenario finden, in dem eine globale var die beste Option ist, natürlich können Sie eine haben, aber werfen Sie einen Blick auf diese Beispiele, und Sie können einen besseren Weg finden, um das Gleiche zu erreichen:

Szenario 1: Legen Sie das Zeug in Konfigurationsdateien ab

Sie benötigen einen gewissen Wert, der für die gesamte Anwendung gleich ist. Sie ändert sich jedoch je nach Umgebung (Produktion, Entwicklung oder Test), dem Mailer-Typ als Beispiel, den Sie benötigen:

// File: config/environments/production.json
{
    "mailerType": "SMTP",
    "mailerConfig": {
      "service": "Gmail",
      ....
}

und

// File: config/environments/test.json
{
    "mailerType": "Stub",
    "mailerConfig": {
      "error": false
    }
}

(mache auch eine ähnliche Konfiguration für dev)

Um zu entscheiden, welche Konfiguration geladen wird, erstellen Sie eine Hauptkonfigurationsdatei (diese wird in der gesamten Anwendung verwendet).

// File: config/config.js
var _ = require('underscore');

module.exports = _.extend(
    require(__dirname + '/../config/environments/' + process.env.NODE_ENV + '.json') || {});

Und jetzt kannst du die Daten bekommen wie folgt:

// File: server.js
...
var config = require('./config/config');
...
mailer.setTransport(nodemailer.createTransport(config.mailerType, config.mailerConfig));

Szenario 2: Verwenden Sie eine Konstantendatei

// File: constants.js
module.exports = {
  appName: 'My neat app',
  currentAPIVersion: 3
};

Und benutze es so

// File: config/routes.js

var constants = require('../constants');

module.exports = function(app, passport, auth) {
  var apiroot = '/api/v' + constants.currentAPIVersion;
...
  app.post(apiroot + '/users', users.create);
...

Szenario 3: Verwenden Sie eine Hilfsfunktion, um die Daten abzurufen/festzulegen

Kein großer Fan von diesem, aber Sie können zumindest die Verwendung des 'Namens' (unter Bezugnahme auf das OP-Beispiel) verfolgen und Validierungen vornehmen.

// File: helpers/nameHelper.js

var _name = 'I shall not be null'

exports.getName = function() {
  return _name;
};

exports.setName = function(name) {
  //validate the name...
  _name = name;
};

Und benutze es

// File: controllers/users.js

var nameHelper = require('../helpers/nameHelper.js');

exports.create = function(req, res, next) {
  var user = new User();
  user.name = req.body.name || nameHelper.getName();
  ...

Es könnte einen Anwendungsfall geben, in dem es keine andere Lösung gibt als eine globale var. In der Regel können Sie jedoch die Daten in Ihrer App mithilfe eines dieser Szenarien freigeben, wenn Sie mit node.js beginnen (wie vor einiger Zeit). Versuchen Sie, den Umgang mit den Daten dort zu organisieren, da dies sehr schnell unübersichtlich werden kann.

19
Felipe Pereira

Wenn Sie mehrere Variablen gemeinsam nutzen müssen, verwenden Sie das folgende Format

//module.js
   let name='foobar';
   let city='xyz';
   let company='companyName';

   module.exports={
    name,
    city,
    company
  }

Verwendungszweck

  // main.js
    require('./modules');
    console.log(name); // print 'foobar'
10

Update

Speichern Sie alle Variablen, die gemeinsam genutzt werden sollen, als ein Objekt. Übergeben Sie es dann an das geladene Modul, damit es über die Objektreferenz auf die Variable zugreifen kann.

// myModule.js
var shared = null;

function init(obj){
    shared = obj;
}

module.exports = {
    init:init
}

.

// main.js
var myModule = require('./myModule.js');
var shares = {value:123};
myModule.init(shares);

Alte Antwort

Um Variablen zwischen Modulen zu teilen, können Sie mit function den Wert der Variablen zwischen dem Hauptmodul und den Modulen ermitteln.

//myModule.js
var mainFunction = null; //You can also put function reference in a Object or Array

function functionProxy(func){
    mainFunction = func; //Save the function reference
}

// --- Usage ---
// setTimeout(function(){
//   console.log(mainFunction('myString'));
//   console.log(mainFunction('myNumber'));
// }, 3000);

module.exports = {
    functionProxy:functionProxy
}

.

//main.js
var myModule = require('./myModule.js');
var myString = "heyy";
var myNumber = 12345;

function internalVariable(select){
    if(select=='myString') return myString;
    else if(select=='myNumber') return myNumber;
    else return null;
}

myModule.functionProxy(internalVariable);


// --- If you like to be able to set the variable too ---
// function internalVariable(select, set){
//    if(select=='myString'){
//        if(set!=undefined) myString = set;
//        else return myString;
//    }
//    else if(select=='myNumber'){
//      if(set!=undefined) myNumber = set;
//      else return myNumber;
//    }
//    else return null;
// }

Sie können den Wert immer aus main.js erhalten, auch wenn der Wert geändert wurde.

3
StefansArya

eine mit oder ohne das Schlüsselwort var deklarierte Variable wurde an das globale Objekt angehängt. Dies ist die Grundlage zum Erstellen globaler Variablen in Node durch Deklaration von Variablen ohne das Schlüsselwort var. Variablen, die mit dem Schlüsselwort var deklariert wurden, bleiben lokal für ein Modul.

weitere Informationen finden Sie in diesem Artikel - https://www.hacksparrow.com/global-variables-in-node-js.html

0
criz

Mit einer anderen Meinung denke ich, dass die Variablen global die beste Wahl sein könnten, wenn Sie Ihren Code in npm veröffentlichen. Wenn Sie also eine Datei zum Exportieren eines singleton-Objekts verwenden, führt dies hier zu Problemen.

Sie können global, require.main oder beliebige andere Objekte auswählen, die zwischen Dateien gemeinsam genutzt werden.

Bitte sagen Sie mir, ob es bessere Lösungen gibt.

0
LCB