Node.js module.exports赋值导致方法未定义错误

时间:2013-04-09 17:21:31

标签: node.js

为了简化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;

但这不干净,我只是不明白为什么第一个选项不起作用。

如果您可以向我展示我做错了什么或解释为什么第一种方法不起作用,那么在我的投票中这将被视为已核对的答案。

1 个答案:

答案 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.exportsexports会指向不同的内容。

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

exports = { test: 'test' };

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

require()查找要包含的内容时,它会使用module.exports