Normalement, cela devrait fonctionner correctement, mais voyons pourquoi cela pourrait échouer.
Certains Contexte premier
Ce qui se passe est que exports
est un objet qui, avec quelques autres choses comme require
, module
, __dirname
etc., se transmet dans la fermeture qui enveloppe le contenu des modules, exports
est alors retourné par require()
.
Voir: https://github.com/ry/node/blob/master/src/node.js#L327
this
l'intérieur du module se réfère à l'objet exports
, l'objet module
détient alors une référence à l'objet exports
. L'espace de nom à l'intérieur du module est fourni via la fermeture. En fin de compte, il y a aussi l'objet global
qui fournit l'espace de nom global et héberge des choses comme process
.
Exemples
// main.js
this.bla = function(){} // sets bla on the the exports object
require('./sub');
console.log(this); // { bla: [Function] }
console.log(exports); // { bla: [Function] }
console.log(module); /* { id: '.',
exports: { bla: [Function] },
parent: undefined,
filename: '/home/ivo/Desktop/main.js',
loaded: false,
exited: false,
children: [] } */
// sub.js
this.greet = function() {} // sets greet on the exports object
console.log(this); // { greet: [Function] }
console.log(exports); // { greet: [Function] }
console.log(module); /* { id: './sub',
exports: { greet: [Function] },
parent:
{ id: '.',
exports: { bla: [Function] },
parent: undefined,
filename: '/home/ivo/Desktop/main.js',
loaded: false,
exited: false,
children: [] },
filename: '/home/ivo/Desktop/sub.js',
loaded: false,
exited: false,
children: [] } */
cause du problème
La seule explication pour le fait que votre code ne fonctionne pas est que la variable d'environnement NODE_MODULE_CONTEXTS
a été fixé à un entier plus grand que zéro.
Dans ce cas, les modules sont exécutés dans leur propre contexte. this
à l'intérieur du module principal va maintenant se référer à l'objet global
et à l'intérieur des sous-modules, il se référera à un objet bac à sable. Par conséquent, this.foo
ne définira aucune propriété sur l'objet exports
.
Voir: https://github.com/ry/node/blob/master/src/node.js#L98
Et: https://github.com/ry/node/blob/master/src/node.js#L296
Fixation du problème
Vous pouvez vérifier les variables d'environnement qui ont été transmises au processus de noeud:
console.log(process.env); // get a list of all variables
// get just the one that's causing trouble, if this returns a number > 0 then it's in effect
console.log(process.env['NODE_MODULE_CONTEXTS']);
Dans le cas où NODE_MODULE_CONTEXTS
est en effet, vous devez vérifier vos fichiers ~/.bashrc
et ~/.bash_profile
pour quelque chose comme export NODE_MODULE_CONTEXTS=1;
et retirez-le.
Assurez-vous d'ouvrir un nouveau terminal, car les modifications apportées à ces deux fichiers ne sont lues que lorsqu'elles sont créées.
Je voulais juste demander si ma réponse sur l'environnement varaible vous a été utile, sinon cela pourrait être un bug qui devrait être classé :) –