2010-11-30 26 views
9

Dans un fichier, j'ai ce code:Get module.exports à partir du même fichier

module.exports.greet = function() {...} 

Je veux utiliser cette fonction à partir du même fichier.

Je pensais que cela fonctionnerait:

this.greet() 

Mais il n'a pas fait.

Quelle est la référence que je dois utiliser?

+0

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é :) –

Répondre

11

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.