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