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