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

Node.js module.exports赋值导致方法未定义错误,node.js,Node.js,为了简化mongoose安装,我在我的/lib目录中创建了一个mongoose.js文件。它设置mongoose以便消费模块可以准备好连接等。问题是,当尝试访问product.js上的mongoose.Schema方法时,它抛出了未定义的方法。在为我自己的对象进行类似的实践时,这不会发生。这是有问题的代码 /lib/mongoose.js lib文件 /models/product.js消费文件 var mongoose = require('../lib/mongoose.js'); var

为了简化mongoose安装,我在我的/lib目录中创建了一个mongoose.js文件。它设置mongoose以便消费模块可以准备好连接等。问题是,当尝试访问product.js上的mongoose.Schema方法时,它抛出了未定义的方法。在为我自己的对象进行类似的实践时,这不会发生。这是有问题的代码

/lib/mongoose.js lib文件

/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;
但这并不干净,我不明白为什么第一个选项不起作用

如果您可以向我说明我做错了什么,或者解释第一种方法不起作用的原因,那么这将被视为我的赞成票的已核对答案。

您不能重新分配exports变量,但可以使用module.exports

如果您想知道为什么,那么每个模块中的内容基本上是:

var module = { exports: {} };
var exports = module.exports;
因此,如果将属性添加到导出中,仍然可以通过module.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。

谢谢!这是一个非常简单的解决办法。我很感谢你更详细的解释。这对我来说更有意义,因为exports变量只是附加到模块的引用。如果重新分配,则删除模块引用。令人惊叹的是的,作为旁注,我总是使用module.exports,因为导出的所有缺点。最重要的是,不要在一个文件中混合使用这两种方法,否则会遇到问题。
var module = { exports: {} };
var exports = module.exports;
exports.test = function () { console.log('test'); };
module.exports.test(); // outputs 'test'
var module = { exports: {} };
var exports = module.exports;

exports = { test: 'test' };

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