Храните модели в папке, используйте index.js, чтобы потребовать их всех
у меня есть проект приличного размера и мне нужно сделать небольшую перестройку.
Я использую Мангуста в качестве моего ORM для узла. Я хотел бы поместить все мои модели мангустов в папку под названием "модели". Я читал, что когда я это делаю, я могу поместить индекс.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
...
Я застрял на том, что мне нужно сделать в индексе.JS, чтобы вернуть все мои модели
.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;
также я должен пройти в мангусте из приложения.js, так как мне нужно было там подключиться к монго? То есть я могу потребовать его снова в индексе.js, но я не уверен, что требование одного и того же модуля в разных файлах-плохая практика.
EDIT: (вот на моих моделях)
Извините, забыл упомянуть, что я добавляю функции типа "accessor" в мои классы моделей. И. Е. Я хотел бы представить открытый интерфейс для каждой модели.
пользователей.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 ответов
в узел.JS, модули кэшируются после первой загрузки. Так что вам не нужно проходить mongoose
из приложения.js.
например, в моделях индекса/.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.
в модели/пользователя.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);
}
в приложение.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();
...
});
подробнее о кэшировании модулей в узле.Яш: http://nodejs.org/api/modules.html#modules_caching
еще один очень хороший подход для вызова всех моделей простым и чистым способом может быть следующим:
структура проекта:
.
├── 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);
})