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?
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;
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.
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'
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..
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