Mongoose&NodeJS项目的文件结构

我目前在我的Mongoose / NodeJS应用程序的/models/models.js文件中有我的所有模型(模式定义)。

我想分解成不同的文件,如:user_account.js,profile.js等,但我似乎无法这样做,因为我的控制器中断,并报告“ 无法find模块 ”,一旦我把这些类拉开。

我的项目结构如下:

/MyProject /controllers user.js foo.js bar.js // ... etc, etc /models models.js server.js 

我的models.js文件的内容如下所示:

 var mongoose = require('mongoose'), Schema = mongoose.Schema, ObjectId = Schema.ObjectId; mongoose.connect('mongodb://localhost/mydb'); var UserAccount = new Schema({ user_name : { type: String, required: true, lowercase: true, trim: true, index: { unique: true } }, password : { type: String, required: true }, date_created : { type: Date, required: true, default: Date.now } }); var Product = new Schema({ upc : { type: String, required: true, index: { unique: true } }, description : { type: String, trim: true }, size_weight : { type: String, trim: true } }); 

我的user.js文件(控制器)看起来像这样:

 var mongoose = require('mongoose'), UserAccount = mongoose.model('user_account', UserAccount); exports.create = function(req, res, next) { var username = req.body.username; var password = req.body.password; // Do epic sh...what?! :) } 

如何将模式定义分解为多个文件并从我的控制器中引用? 当我引用它(模式在一个新文件后),我得到这个错误:

*错误:架构尚未注册模型“user_account”。*

思考?

这是一个示例app/models/item.js

 var mongoose = require("mongoose"); var ItemSchema = new mongoose.Schema({ name: { type: String, index: true }, equipped: Boolean, owner_id: { type: mongoose.Schema.Types.ObjectId, index: true }, room_id: { type: mongoose.Schema.Types.ObjectId, index: true } }); var Item = mongoose.model('Item', ItemSchema); module.exports = { Item: Item } 

要从app/controllers/items.js的项目控制器app/controllers/items.js我会这样做

  var Item = require("../models/item").Item; //Now you can do Item.find, Item.update, etc 

换句话说,在模型模块中定义模式和模型,然后导出模型。 使用相对需求path将模型模块加载到控制器模块中。

要进行连接,请在服务器启动代码( server.js或其他)中尽早处理。 通常,您需要从configuration文件或环境variables读取连接参数,如果未提供configuration,则默认为开发模式localhost。

 var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost'); 

这里有一对夫妇的答案确实帮助我开发了另一种方法。 最初的问题是关于打破模式定义,但我更喜欢将模式和模型定义绑定在同一个文件中。

这大部分是Peter的想法,只通过重写module.exports来导出模型定义,使得从你的控制器访问模型稍微冗长:

项目布局:

 MyProject /controllers user.js foo.js bar.js // ... etc, etc /models Item.js server.js 

models / Item.js将如下所示:

 var mongoose = require("mongoose"); var ItemSchema = new mongoose.Schema({ name: { type: String, index: true } }); module.exports = mongoose.model('Item', ItemSchema); // Now `require('Item.js')` will return a mongoose Model, // without needing to do require('Item.js').Item 

你可以在控制器中访问模型,比如user.js,比如:

 var Item = require(__dirname+'/../models/Item') ... var item = new Item({name:'Foobar'}); 

不要忘记在server.js中调用mongoose.connect(..),或者你认为合适的地方。

我最近回答了关于同样问题的Quora问题。 http://qr.ae/RoCld1

我发现非常好,并保存在需求调用的数量是将您的模型结构到一个单一的目录。 确保每个文件只有一个模型。

在与您的模型相同的目录中创build一个index.js文件。 将此代码添加到它。 一定要添加必要的FS要求

 var fs = require('fs'); /* * initializes all models and sources them as .model-name */ fs.readdirSync(__dirname).forEach(function(file) { if (file !== 'index.js') { var moduleName = file.split('.')[0]; exports[moduleName] = require('./' + moduleName); } }); 

现在您可以按照以下方式调用您的所有模型:

 var models = require('./path/to/models'); var User = models.user; var OtherModel = models['other-model']; 

彼得里昂几乎涵盖了基础。
从上面的例子中借用(删除模式之后的行)我只是想添加:

app/models/item.js

 note: notice where `module.exports` is placed var mongoose = require("mongoose"); var ItemSchema = module.exports = new mongoose.Schema({ name: { type: String, index: true }, ... }); 

app/controllers/items.js加载它

 var mongoose = require('mongoose'); var Item = mongoose.model('Item', require('../models/item')); 

没有module.exports另一种方法是module.exportsrequire

app/models/item.js

 var mongoose = require("mongoose"); var ItemSchema = new mongoose.Schema({ name: { type: String, index: true }, ... }); mongoose.model('Item', ItemSchema); // register model 

app/controllers/items.js

 var mongoose = require('mongoose') , Item = mongoose.model('Item'); // registered model