2010-11-30 19 views
9

En un archivo que tengo este código:Obtener module.exports desde dentro del mismo archivo

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

Quiero usar esa función desde dentro del mismo archivo.

pensé que esto funcionaría:

this.greet() 

pero no lo hizo.

¿Cuál es la referencia que debo usar?

+0

Sólo quería preguntar si mi respuesta sobre el entorno varaible fue útil para usted, de lo contrario, podría ser un error que debe ser presentado :) –

Respuesta

11

Normalmente, esto debería funcionar bien, pero veamos por qué podría fallar.

Algunos antecedentes primera
Lo que pasa es que exports es un objeto que, junto con algunas otras cosas como require, module, __dirname etc., se pasa en el cierre que envuelve el contenido de módulos, es entonces exports devuelto por require().

Ver: https://github.com/ry/node/blob/master/src/node.js#L327

this el interior del módulo se refiere al objeto exports, el objeto module continuación, contiene una referencia al objeto exports. El espacio de nombre dentro del módulo se proporciona a través del cierre.

Al final también está el objeto global que proporciona el espacio de nombre global y aloja cosas como process.

Ejemplos

// 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: [] } */ 

causa del problema
La única explicación para el hecho de que su código no funciona es que la variable de entorno NODE_MODULE_CONTEXTS se establece en un número entero mayor que cero.

En este caso, los módulos se ejecutan en su propio contexto. this dentro del módulo principal ahora se referirá al objeto global y dentro de los submódulos, se referirá a un objeto sandbox. Por lo tanto, this.foo no establecerá ninguna propiedad en el objeto exports.

Ver: https://github.com/ry/node/blob/master/src/node.js#L98
Y: https://github.com/ry/node/blob/master/src/node.js#L296

Arreglar el problema
Puede comprobar las variables de entorno que se han pasado al proceso de nodo:

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']); 

En caso de que NODE_MODULE_CONTEXTS es en efecto, necesita verificar sus archivos ~/.bashrc y ~/.bash_profile para algo como export NODE_MODULE_CONTEXTS=1; y eliminarlo

Asegúrese de abrir un nuevo terminal, ya que los cambios de esos dos archivos solo se leen cuando se crea uno.

Cuestiones relacionadas