#node.js #express #mongoose #sails.js
#node.js #экспресс #мангуст #sails.js
Вопрос:
Я хочу загрузить все свои модели при запуске сервера, чтобы не было необходимости включать файл модели перед каким-либо взаимодействием с сервером.
Прямо сейчас мне просто требуется файл во всех контроллерах и других файлах, где у меня есть необходимость. Но я планирую создать файл, включающий все модели, и сделать их глобальными при запуске сервера. Так что мне не нужно требовать их везде.
например :-
global.ConfigModel = require(APP_PATH '/api/models/ConfigModel.js');
Итак, не могли бы вы, пожалуйста, указать мне, хороший ли это у меня подход или нужно использовать другой подход.
Я хочу реализовать Sails Js Framework для начальной загрузки моделей и сервисов, чтобы не было необходимости запрашивать файлы снова и снова.
Любая помощь?
Ответ №1:
Использование global
не очень хорошая идея. Но использование require()
для желаемых моделей снова и снова в каждом файле службы также является громоздким.
Я бы посоветовал вам иметь правильную иерархию каталогов и использовать index.js
. Например,
project_dir/
models/
Book.js
Config.js
index.js
services/
auth.js
book.js
index.js
В models/index.js
я require
запускаю все модели только один раз:
'use strict';
module.exports = {
Book: require('./Book'),
Config: require('./Config')
};
То же самое касается services/index.js
.
Затем в любом месте я просто require
открываю каталог моделей и получаю доступ к каждой модели как к одному из ее ключей.
'use strict';
const models = require('./models'); // It looks for index.js in ./models
function myfunc() {
return models.Book.getAll();
}
Таким образом, вам не придется require
запускать все модели снова и снова, и это также выглядит чистым.
Я использую его для моделей, помощников, сервисов, репозиториев, маршрутов.
Надеюсь, это поможет!
Ответ №2:
Передавая экспресс-приложение вспомогательным методам, мы можем собрать все модели и контроллеры и добавить их в объекты app.models и app.controllers соответственно. Мы также просматриваем маршруты, но нам не нужно их сохранять.
Структура каталогов:
myApplication
|__ src
| |__ controllers
| |__ Account.js
| index.js
| User.js
| models
| |__ Account.js
| index.js
| User.js
| routes
| |__ account.js
| index.js
| user.js
|
|__ node_modules
|__ package.json
|__
|__
|__
|
|__ server.js
Мы используем index.js файлы для наших вспомогательных методов. Эти методы просто перебирают все файлы js в каталоге (за исключением index.js ) и потребовать их.
// controllers/index.js
var fs = require('fs');
var path = require('path');
module.exports = function(app) {
app.controllers = {};
fs.readdirSync(__dirname).forEach(function(f) {
if (f !== "index.js" amp;amp; path.extname(f) === '.js'){
var controller = require(path.join(__dirname,f))(app);
app.controllers[controller.name] = controller;
}
});
};
// models/index.js
var fs = require('fs');
var path = require('path');
module.exports = function(app) {
app.models = {};
fs.readdirSync(__dirname).forEach(function(f) {
if (f !== "index.js" amp;amp; path.extname(f) === '.js'){
var model = require(path.join(__dirname,f))(app);
app.models[model.modelName] = model;
}
});
};
// routes/index.js
var fs = require('fs');
var path = require('path');
module.exports = function (app) {
fs.readdirSync(__dirname).forEach(function(file) {
if (file !== "index.js" amp;amp; path.extname(file) === '.js'){
require(path.join(__dirname, file))(app);
}
});
};
Пример модели, контроллера и маршрута:
// models/Account.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = function(){
var AccountSchema = new Schema({
number : {type : String, required: true},
owner: {type: Schema.Types.ObjectId, ref: 'User'}
});
return mongoose.model("Account", AccountSchema); //'Account' is used to access this model as app.models.Account
};
// controllers/Account.js
module.exports = function(app) {
var Account = app.models.Account;
var Controller = {
name: 'Account' //this name is used to access this controller in routes as app.controllers.Account
};
// POST method to create user account
Controller.createAccount = function(req, res) {
Account.create(req.body, function(err, result){
if(err){
res.status(500).send("Server Error")
}
else{
res.send({message: "account created"});
}
})
};
return Controller;
};
// routes/account.js
module.exports = function (app) {
var AccountController = app.controllers.Account;
app.post('/api/accounts', AccountController.createAccount);
};
И в server.js:
var express = require('express');
var app = express();
.
.
.
. // server configurations
.
.
.
// maintain the below order:
require("./src/models")(app); // call the method in /src/models/index.js and pass express app
require("./src/controllers")(app);
require("./src/routes")(app);
Вы бы не добавляли пустой файл js в модели, контроллеры или маршруты, так как это произойдет из-за ошибки.
Ответ №3:
Добавление переменных в глобальное пространство имен может быть кошмаром для поддержки, особенно когда проект становится все больше и больше. Вы загрязняете глобальное пространство имен без причины, другие разработчики, которые, возможно, присоединятся к проекту, не смогут достаточно легко понять, что происходит, и существует опасность перезаписи этой переменной. Лично я против такого подхода. Это всего лишь одна строка, которую вы должны требовать для каждого файла, и это сохранит безопасность вашего проекта.
Если вы хотите избавиться от требований и иметь все присутствующие зависимости, тогда лучше искать внедрение зависимостей и инверсию управления. Есть несколько модулей, которые могут сделать это за вас, и я бы предложил немного изучить их.
Комментарии:
1. Спасибо за информацию. Но разве вы не думали, что если у меня много файлов контроллера, служб, мне все время нужно запрашивать файл. Так что это тоже просто скучный материал. Вот почему я просто думаю найти лучшее решение для этого.