为了简化mongoose设置,我在/ lib目录中创建了一个mongoose.js文件。它设置mongoose所以消耗模块可以准备连接等。问题是,当尝试访问product.js上的 mongoose.Schema 方法时,它会抛出未定义的方法。在为我自己的对象做类似的练习时,这不会发生。这是有问题的代码。
/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;
但这不干净,我只是不明白为什么第一个选项不起作用。
如果您可以向我展示我做错了什么或解释为什么第一种方法不起作用,那么在我的投票中这将被视为已核对的答案。
答案 0 :(得分: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.exports
和exports
会指向不同的内容。
var module = { exports: {} };
var exports = module.exports;
exports = { test: 'test' };
console.log(exports); // { test: 'test' }
console.log(module.exports); // {}
当require()
查找要包含的内容时,它会使用module.exports
。