2012-03-09 9 views
5

No creo que entiendo bien cómo funciona exports en Node.js. En un poco de código de ejemplo, he notado el objeto exports utiliza de esta manera:Comprensión de las exportaciones en NodeJS

exports = mongoose = require('mongoose') 
mongoose.connect(config.db.uri) 
exports = Schema = mongoose.Schema 

Lo que está sucediendo detrás de las escenas cuando se utiliza exports = el doble de esa manera? Me parece que "mangosta" no debería exportarse. Hice esta prueba rápida:

var foo 
    , bar 

exports = foo = 'foo' 
exports = bar = 'bar' 

// reports 'bar' only 
console.log(exports) 

y la segunda prueba sobrescribe la primera exportación.

+0

Sí, eso es extraño. Generalmente, esperarías un 'exports.foo = 'foo'' etc. –

+2

Es posible que el mangosta.Schema apunte a la mangosta. –

+0

Estoy tratando de resolver esto por mí mismo, y lo mejor que puedo decir, las 3 líneas no hacen nada. Al establecer el objeto de exportación, el objeto de exportación global se pierde. Por lo tanto, no se exporta nada de este archivo. La otra cosa clave es que esas variables (mangosta y esquema) se están definiendo al objeto global. Esto parece una forma de indicar que estas variables van a ser globales y este archivo no las exporta a través de la interfaz del módulo. No puedo ver ninguna otra razón para hacer esto. – sujal

Respuesta

15

Supongo que el autor original de ese código de ejemplo se confunde con module.exports frente a exports. Para utilizar el objeto exports, debe agregar propiedades de esta manera:

exports.size = 42; 

Si vuelve a asignar la variable de exports a un nuevo objeto, que, básicamente, pierde el acceso a las exportaciones globales objetar que Node.js proporcionado para ti. Si haces esto dos o tres veces o N veces, el efecto es el mismo. Es inutil. Por ejemplo: mod_b.js

var realExports = exports; 
realExports.height = 42; 
var exports = {}; 
exports.weight = 43; 

Y en mod_a.js

var mod_b = require('./mod_b'); 
console.dir(mod_b); 

Run node mod_a.js y se obtiene:

{ height: 42 } 

Aviso height está ahí, pero no es weight. Ahora, lo que puede hacer es asignar module.exports para que sea un objeto, y ese es el objeto que se devolverá cuando otro módulo require sea su módulo. Entonces verás cosas como

var x = 10; 
var y = 20; 
module.exports = {x: x, y: y}; 

Que hará lo que usted espera. Aquí hay algunos artículos informativos sobre los detalles.

Node.js Module – exports vs module.exports

What is the purpose of NodeJS module.exports and how do you use it?

Mastering Node

+0

El enlace Mastering Node fue muy útil. Gracias. –

1

Como una extensión a @ respuesta de Pedro-Lyon, el ejemplo es válido, el caso de test es incorrecta.

No se recomienda exportar variables como esta, pero al hacerlo, expone estas variables en un espacio de nombres global.

p. Ej. test0.js

'use strict'; 

var assert = require('assert'); 
var test1 = require('./test1'); 

assert(globalVar1 === 123); 
assert(globalVar2.a === 123); 

test1.js - mente la falta 'use strict';

exports = globalVar1 = 123; 
exports = globalVar2 = {a:123}; 

Una vez más, es válida, pero no es recomendable.

Saludos.

Cuestiones relacionadas