Как загрузить все модели и службы на сервере start Express js

#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. Спасибо за информацию. Но разве вы не думали, что если у меня много файлов контроллера, служб, мне все время нужно запрашивать файл. Так что это тоже просто скучный материал. Вот почему я просто думаю найти лучшее решение для этого.