Partagez les variables entre les fichiers dans le noeud.js?

voici 2 fichiers:

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

// module.js
name = "foobar";

quand je n'ai pas" var " ça marche. Mais quand j'ai:

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

ne sera pas défini dans main.js.

j'ai entendu que les variables globales sont mauvaises et vous feriez mieux d'utiliser" var " avant les références. Mais est-ce un cas où les variables globales sont bonnes?

96
demandé sur Amit G 2010-10-13 15:11:36

5 réponses

variables Globales sont presque jamais une bonne chose (peut-être une exception ou deux là-bas...). Dans ce cas, il semble que vous vouliez simplement exporter votre variable "name". Par exemple,

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

puis, dans la 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;
148
répondu jmar777 2010-10-13 11:47:23

je suis incapable de trouver un scénario où une var globale est la meilleure option, bien sûr, vous pouvez en avoir un, mais jetez un oeil à ces exemples et vous pouvez trouver une meilleure façon d'accomplir la même chose:

scénario 1: Mettez le contenu dans les fichiers de configuration

vous avez besoin d'une certaine valeur qu'il est le même dans toute l'application, mais il change en fonction de l'environnement (production, dev ou test), le type de mailer comme exemple:

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

et

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

(faire une config similaire pour les dev trop)

pour décider quelle config sera chargée, créer un fichier de configuration principal (qui sera utilisé dans toute l'application)

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

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

Et maintenant vous pouvez obtenir les données comme ceci:

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

scénario 2: Utiliser un fichier de constantes

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

et l'utiliser de cette façon

// 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);
...

scénario 3: Utiliser une fonction d'aide pour obtenir / définir les données

pas un grand fan de celui-ci, mais au moins vous pouvez suivre l'utilisation du " nom " (en citant l'exemple de L'OP) et mettre des validations en place.

// 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;
};

et l'utiliser

// 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();
  ...

Il pourrait y avoir un cas d'utilisation quand il n'y a pas d'autre solution que ayant un var global, mais généralement vous pouvez partager les données dans votre application en utilisant l'un de ces scénarios, si vous commencez à utiliser noeud.js (comme je l'étais il y a quelque temps) essayer d'organiser la façon dont vous manipulez les données là-bas parce que cela peut devenir désordre vraiment rapide.

15
répondu Felipe Pereira 2018-02-14 00:56:01

si nous avons besoin de partager des variables multiples utiliser le format ci-dessous

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

   module.exports={
    name,
    city,
    company
  }

Utilisation

  // main.js
    require('./modules');
    console.log(name); // print 'foobar'
9
répondu Vineeth Bhaskaran 2017-10-21 16:26:01

mise à Jour

Sauvegardez toute variable qui veut être partagée en un seul objet. Puis passez-le au module chargé pour qu'il puisse accéder à la variable par référence d'objet..

// 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);

Vieille Réponse

pour partager la variable entre les modules, vous pouvez utiliser la fonction pour obtenir la valeur de la variable entre le principal et les modules.

//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;
// }

Vous pouvez toujours obtenir la valeur de main.js même la valeur a été modifiée..

3
répondu StefansArya 2018-02-07 12:36:29

une variable déclarée avec ou sans le mot-clé var s'est attachée à l'objet global. C'est la base pour créer des variables globales dans le noeud en déclarant des variables sans le mot-clé var. Tandis que les variables déclarées avec le mot-clé var restent locales à un module.

voir cet article pour plus de compréhension - https://www.hacksparrow.com/global-variables-in-node-js.html

0
répondu criz 2017-06-29 12:41:27