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

Jas*_*ing 0 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;
Run Code Online (Sandbox Code Playgroud)

/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);
Run Code Online (Sandbox Code Playgroud)

如果我在/lib/mongoose.js中执行以下操作,我可以使其工作

exports.mongoose = mongoose;
Run Code Online (Sandbox Code Playgroud)

然后在/models/product.js中

var mongoose = require('mongoose').mongoose;
Run Code Online (Sandbox Code Playgroud)

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

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

Bre*_*and 7

您无法重新分配exports变量,而是可以使用module.exports

module.exports = mongoose;
Run Code Online (Sandbox Code Playgroud)

如果你想知道为什么,你在每个模块中拥有的基本上是这样的:

var module = { exports: {} };
var exports = module.exports;
Run Code Online (Sandbox Code Playgroud)

因此,如果您添加属性exports,您仍然可以访问它们module.exports

exports.test = function () { console.log('test'); };
module.exports.test(); // outputs 'test'
Run Code Online (Sandbox Code Playgroud)

但是,如果你重新分配exports,然后module.exportsexports一点不同的东西.

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

exports = { test: 'test' };

console.log(exports);        // { test: 'test' }
console.log(module.exports); // {}
Run Code Online (Sandbox Code Playgroud)

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