Храните модели в папке, используйте индекс.js требовать их всех
У меня есть проект приличного размера, и мне нужно сделать небольшую реструктуризацию.
Я использую Мангуста в качестве моего ОРМ для узла. Я хотел бы поместить все мои модели мангустов в папку под названием "модели". Я читал, что, когда я это делаю, я могу поставить указатель.JS файл в папке models такой, что будет тянуть в себя все модели и хранить их.
Приложение.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(); ... });
Подробнее о кэшировании модулей в узле.JS: http://nodejs.org/api/modules.html#modules_caching
Еще один очень хороший подход для вызова всех моделей простым и чистым способом может быть следующим:
Структура проекта:
. ├── app.js └── models ├── Role.js ├── Team.js └── User.js
Приложение.js
const fs = require('fs'); const path = require('path'); const modelsPath = path.resolve(__dirname, 'models') fs.readdirSync(modelsPath).forEach(file => { require(modelsPath + '/' + file); })