0

为了使 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;

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

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

4

1 回答 1

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.

于 2013-04-09T17:54:43.097 回答