2013-04-09 125 views
0

爲了簡化貓鼬設置,我在我的/ lib目錄中創建了一個mongoose.js文件。它設置貓鼬所以消費模塊可以準備好連接等。問題是,當試圖訪問產品.js上的方法mongoose.Schema時,它拋出的方法未定義。在爲自己的對象做類似的練習時,這不會發生。這是有問題的代碼。Node.js module.exports分配導致方法未定義錯誤

/lib/mongoose.js(LIB文件)

var mongoose = require('mongoose'); 
mongoose.connect(process.env.PPC_API_MONGODB_URL); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
    console.log('db open'); 
}); 

exports = mongoose; 

/models/product.js(消耗文件)

var mongoose = require('../lib/mongoose.js'); 

var productSchema = mongoose.Schema({ // results in method undefined here 
    name: String 
}); 

exports = mongoose.model('Product', productSchema); 

,我可以得到,如果這工作,我請在/lib/mongoose.js中執行以下操作:

exports.mongoose = mongoose; 

然後內/models/product.js

var mongoose = require('mongoose').mongoose; 

,但這是不乾淨的,我簡直不理解爲什麼第一個選項是行不通的。

如果你可以告訴我我做錯了什麼,或者解釋爲什麼第一種方法不起作用,那麼這將被視爲我的投票結果。

回答

7

你不能重新分配exports變量,而是可以使用module.exports

module.exports = mongoose; 

如果你想知道爲什麼,你必須在每個模塊本質上是這樣的:

var module = { exports: {} }; 
var exports = module.exports; 

因此,如果您將屬性添加到exports,仍然可以通過module.exports

exports.test = function() { console.log('test'); }; 
module.exports.test(); // outputs 'test' 

但是如果您重新指定exports,那麼module.exportsexports指向不同的東西。

var module = { exports: {} }; 
var exports = module.exports; 

exports = { test: 'test' }; 

console.log(exports);  // { test: 'test' } 
console.log(module.exports); // {} 

require()查找包括什麼,它採用module.exports

+0

謝謝!這是一個非常簡單的解決方案。 – 2013-04-09 18:29:38

+0

我很欣賞更詳細的解釋。這對我來說更有意義,因爲「出口」變量只是附加到「模塊」的參考。如果你重新分配,那麼你正在擦除「模塊」引用。真棒! – 2013-04-09 19:27:31

+0

是的,作爲一個便箋,我總是使用'module.exports',因爲'exports'的所有缺點。最重要的是,不要在一個文件中混用這兩種文件,否則會遇到問題。 – 2013-04-09 20:34:01

相關問題