了解NodeJS中的导出

时间:2012-03-09 00:08:55

标签: node.js

我不认为我完全理解exports Node.js 中的工作方式。在一些示例代码中,我注意到以这种方式使用的exports对象:

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

当您使用exports =两次时,幕后发生了什么?在我看来像是" mongoose"不应该出口。我做了这个快速测试:

var foo
  , bar

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

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

并且第二个测试会覆盖第一个导出。

2 个答案:

答案 0 :(得分:15)

我的猜测是该示例代码的原作者对module.exports vs exports感到困惑。要使用exports对象,必须像这样添加属性:

exports.size = 42;

如果将exports 变量重新分配给新对象,则基本上无法访问node.js为您提供的全局导出对象。如果这样做两次或三次或N次,效果是一样的。这毫无用处。例如:mod_b.js

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

在mod_a.js

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

运行node mod_a.js,您将获得:

{ height: 42 }

请注意height,但weight不是。现在,你可以做的是将module.exports指定为一个对象,这是当另一个模块require成为你的模块时将返回的对象。所以你会看到类似的东西。

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

哪个会做你期望的。这里有一些关于细节的信息性文章。

Node.js Module – exports vs module.exports

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

Mastering Node

答案 1 :(得分:1)

作为@ Peter-Lyons答案的扩展,您的示例有效,您的测试用例不正确。

不推荐像这样导出变量,但通过这样做,您将这些变量暴露给全局命名空间。

e.g。 test0.js

'use strict';

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

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

test1.js - 请注意缺少的'use strict';

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

再一次,这是有效的,但不推荐。

干杯。