使用coffeescript(zappa)在nodejs / commonjs中重新导出模块(mongoose)

时间:2011-08-31 23:29:25

标签: node.js coffeescript mongoose

我正在使用{{3} }@2.0.4,我想要整齐地抽象出模块中的mongoose.connect()调用。

所以使用nodejs,我期望以下工作:
myMongoose.coffee

mongoose = require 'mongoose'
mongoose.connect 'mongodb://localhost/test'
@exports = mongoose

并在MyModel.coffee

中使用它
mongoose = require 'myMongoose'
console.log mongoose #Prints massive object (including Schema)
Schema = mongoose.Schema
console.log Schema # undefined

为什么访问一个子元素(技术上是构造函数,我认为),如Schema不起作用?即使将@exports.Schema = mongoose.Schema添加到myMongoose.coffee也无法解决问题。

2 个答案:

答案 0 :(得分:6)

你必须设置

module.exports = mongoose

您无法使用新对象覆盖exports。您只能向exports添加属性。

这是因为您的模块实际上是以下内容:

(function(require, module, exports, process) {
  // your code
})();

exports只是一个参数,重新分配它什么都不做。

因此,如果要覆盖导出,请使用module.exports。如果您想延长exports使用exports.Foo

但是,如果你覆盖module.exports,最安全的做法是继续写module.exports代替exports

答案 1 :(得分:1)

+1给Raynos的答案,但还有更多你应该知道的事情:

@ is exports  # true!

所以当你写@exports = mongoose时,这相当于exports.exports = mongoose

@可能更直观地指向module,但是,能够使用@导出大量内容非常方便,尤其是如果您想要在浏览器中运行相同的代码(其中@将指向window,您可以快速填充全局范围。)