将模型存储在文件夹中,使用index.js来全部要求它们

时间:2013-06-22 03:10:19

标签: node.js commonjs

我有一个体面的项目,我需要进行一些重组。

我使用mongoose作为节点的ORM。我想将所有猫鼬模型放在一个名为'models'的文件夹中。我已经读过,当我这样做时,我可以将一个index.js文件放在models文件夹中,以便拉入所有模型并存储它们。

app.js:

...
var mongoose = require('mongoose');
var models = require('./models')(mongoose);

app.configure(function () {
  mongoose.connect(dbPath, function(err) {
    if (err) throw err;
  });
  ...
});

// include models in my routes so I need access
...

我完全陷入了我需要在index.js中做的事情,以返回我的所有模型

index.js(这是我尝试过的,甚至没有关闭)

function Models(mongoose) {
    var Counters = require('./counters')(mongoose);
    var User = require('./user')(mongoose);
    var Token = require('./token')(mongoose);
    var Team = require('./team')(mongoose);
    var Role =  require('./role')();
    var Layer = require('./layer')(mongoose, counters);
    var Feature = require('./feature')(mongoose, counters, async);


}

module.exports = Models;

我也应该从app.js传入mongoose,因为我需要连接到mongo吗? I.E.我可以在index.js中再次要求它,但我不确定在不同的文件中是否需要相同的模块是不好的做法。

编辑:(这是我的模特)

抱歉忘了提到我在我的模型类中添加'accessor'类型函数。 I.E.我想为每个模型提供一个公共界面。

user.js的:

module.exports = function(mongoose) {

  // Creates a new Mongoose Schema object
  var Schema = mongoose.Schema; 

  // Collection to hold users
  var UserSchema = new Schema({
      username: { type: String, required: true },
      password: { type: String, required: true },
    },{ 
      versionKey: false 
    }
  );

  // Creates the Model for the User Schema
  var User = mongoose.model('User', UserSchema);

  var getUserById = function(id, callback) {
    User.findById(id, callback);
  }

  var getUserByUsername = function(username, callback) {
    var query = {username: username};
    User.findOne(query, callback);
  }


  return {
    getUserById: getUserById,
    getUserByUsername: getUserByUsername
  }
} 

2 个答案:

答案 0 :(得分:19)

在node.js中,模块在第一次加载后被缓存。因此,您无需从app.js传递mongoose

例如,在models / index.js中:

require('./counters')
exports.User = require('./user')
require('./token');
require('./team');
require('./role');
require('./layer');
require('./feature');
// I prefer to use a loop to require all the js files in the folder.

在models / user.js中:

var mongoose = require('mongoose');
var userSchema = mongoose.Schema({
  // ... Define your schema here
});

var User = module.exports = mongoose.model('User', userSchema);
module.exports.getUserById = function(id, callback) {
  User.findById(id, callback);
}

module.exports.getUserByUsername = function(username, callback) {
  var query = {username: username};
  User.findOne(query, callback);
}
app.js中的

var mongoose = require('mongoose');
var models = require('./models');

mongoose.connect(dbPath, function(err) {
  if (err) throw err;
});

// Yes! You can use the model defined in the models/user.js directly
var UserModel = mongoose.model('User');

// Or, you can use it this way:
UserModel = models.User;

app.get('/', function(req, res) {
  var user = new UserModel();
  user.name = 'bob';
  user.save();
  // UserModel.getUserByUsername();
  ...
});

了解有关node.js中模块缓存的更多信息: http://nodejs.org/api/modules.html#modules_caching

答案 1 :(得分:5)

另一个以简单而干净的方式调用所有模型的非常好的方法可能就是这个:

项目结构:

.   
├── app.js
└── models
    ├── Role.js
    ├── Team.js
    └── User.js

<强> app.js

const fs = require('fs');
const path = require('path');

const modelsPath = path.resolve(__dirname, 'models')
fs.readdirSync(modelsPath).forEach(file => {
  require(modelsPath + '/' + file);
})