ExpressJS Как структурировать приложение? - PullRequest
505 голосов
/ 25 апреля 2011

Я использую веб-инфраструктуру ExpressJS для NodeJS.

Люди, использующие ExpressJS, размещают свои среды (разработку, производство, тестирование ...), свои маршруты и т. Д. На app.js.Я думаю, что это не очень хороший способ, потому что когда у вас большое приложение, app.js слишком велико!

Я бы хотел иметь такую ​​структуру каталогов:

| my-application
| -- app.js
| -- config/
     | -- environment.js
     | -- routes.js

Вот мой код:

app.js

var express = require('express');
var app = module.exports = express.createServer();

require('./config/environment.js')(app, express);
require('./config/routes.js')(app);

app.listen(3000);

config / environment.js

module.exports = function(app, express){
    app.configure(function() {
    app.use(express.logger());
    });

    app.configure('development', function() {
    app.use(express.errorHandler({
        dumpExceptions: true,
        showStack: true
    }));
    });

    app.configure('production', function() {
    app.use(express.errorHandler());
    });
};

config /route.js

module.exports = function(app) {
    app.get('/', function(req, res) {
    res.send('Hello world !');
    });
};

Мой код работает хорошо, и я думаю, что структура каталогов прекрасна.Однако код пришлось адаптировать, и я не уверен, что он хорош / красив.

Лучше использовать мою структуру каталогов и адаптировать код или просто использовать один файл (app.js)?

Спасибо за советы!

Ответы [ 19 ]

6 голосов
/ 04 августа 2011

Ну, я поместил мои маршруты в файл json, который я прочитал в начале, и в цикле for в app.js установил маршруты. В файле route.json указывается, какой вид следует вызвать, и ключ для значений, которые будут отправлены в маршрут.
Это работает для многих простых случаев, но мне пришлось вручную создавать некоторые маршруты для особых случаев.

6 голосов
/ 17 марта 2013

Я написал пост именно по этому вопросу.В основном он использует routeRegistrar, который перебирает файлы в папке /controllers, вызывая его функцию init.Функция init принимает переменную express app в качестве параметра, чтобы вы могли регистрировать маршруты по своему усмотрению.

var fs = require("fs");
var express = require("express");
var app = express();

var controllersFolderPath = __dirname + "/controllers/";
fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
    if(controllerName.indexOf("Controller.js") !== -1){
        var controller = require(controllersFolderPath + controllerName);
        controller.init(app);
    }
});

app.listen(3000);
5 голосов
/ 06 февраля 2013

Это может представлять интерес:

https://github.com/flatiron/nconf

Иерархическая конфигурация node.js с файлами, переменными среды, аргументами командной строки и объединением атомарных объектов.

4 голосов
/ 14 марта 2014

http://locomotivejs.org/ предоставляет способ структурировать приложение, созданное с помощью Node.js и Express.

С веб-сайта:

"Locomotive - это веб-фреймворк дляNode.js. Locomotive поддерживает шаблоны MVC, маршруты RESTful и соглашения о конфигурации, в то же время беспрепятственно интегрируясь с любой базой данных и механизмом шаблонов. Locomotive основывается на Express, сохраняя мощь и простоту, которую вы ожидаете от Node. "

4 голосов
/ 15 июля 2013

1) Ваша файловая система проекта Express может выглядеть так:

/ ...
/lib
/node_modules
/public
/views
      app.js
      config.json
      package.json

app.js - ваш глобальный контейнер приложения

2) Основной файл модуля (lib / mymodule / index.js):

var express = require('express');    
var app = module.exports = express();
// and load module dependencies ...  

// this place to set module settings
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');

// then do module staff    
app.get('/mymodule/route/',function(req,res){ res.send('module works!') });

3) Подключите модуль в главном app.js

...
var mymodule = require('mymodule');
app.use(mymodule);

4) Пример логики

lib/login
lib/db
lib/config
lib/users
lib/verify
lib/
   /api/ 
   ...
lib/
   /admin/
      /users/
      /settings/
      /groups/
...
  • Подходит для тестирования
  • Лучше всего для масштаба
  • Раздельно зависит от модуля
  • Группировка маршрута по функциональности (или модулям)

tj говорит / показывает на VimeoИнтересная идея, как модульное экспресс-приложение - Модульные веб-приложения с Node.js и Express .Мощный и простой.

3 голосов
/ 20 мая 2016

Я недавно принял модули как независимые мини-приложения.

|-- src
  |--module1
  |--module2
     |--www
       |--img
       |--js
       |--css
     |--#.js
     |--index.ejs
  |--module3
  |--www
     |--bower_components
     |--img
     |--js
     |--css
  |--#.js
  |--header.ejs
  |--index.ejs
  |--footer.ejs

Теперь для любого модуля маршрутизации (# .js), представления (* .ejs), js, css и активы находятся рядом друг с другом. маршрутизация подмодуля настраивается в родительском файле # .js с двумя дополнительными строками

router.use('/module2', opt_middleware_check, require('./module2/#'));
router.use(express.static(path.join(__dirname, 'www')));

Таким образом, возможны даже субмодули.

Не забудьте установить представление для каталога src

app.set('views', path.join(__dirname, 'src'));
1 голос
/ 15 июня 2018

Моя структура экспресс 4. https://github.com/odirleiborgert/borgert-express-boilerplate

Пакеты

View engine: twig
Security: helmet
Flash: express-flash
Session: express-session
Encrypt: bcryptjs
Modules: express-load
Database: MongoDB
    ORM: Mongoose
    Mongoose Paginate
    Mongoose Validator
Logs: winston + winston-daily-rotate-file
Nodemon
CSS: stylus
Eslint + Husky

Структура

|-- app
    |-- controllers
    |-- helpers
    |-- middlewares
    |-- models
    |-- routes
    |-- services
|-- bin
|-- logs
|-- node_modules
|-- public
    |-- components
    |-- images
    |-- javascripts
    |-- stylesheets
|-- views
|-- .env
|-- .env-example
|-- app.js
|-- README.md
1 голос
/ 04 августа 2015

Так выглядит большая часть структуры каталогов моего экспресс-проекта.

Обычно я делаю express dirname, чтобы инициализировать проект, простите мою лень, но он очень гибкий и расширяемый. PS - вам нужно получить express-generator для этого (для тех, кто ищет его sudo npm install -g express-generator, sudo, потому что вы устанавливаете его глобально)

|-- bin
    |-- www //what we start with "forever"
|-- bower_components
|-- models
    |-- database.js
    |-- model1.js //not this exact name ofcourse.
    |-- .
|-- node_modules
|-- public
    |-- images
    |-- javascripts
        |-- controllers
        |-- directives
        |-- services
        |-- app.js
        |-- init.js //contains config and used for initializing everything, I work with angular a lot.
    |-- stylesheets
|-- routes
    |-- some
    |-- hierarchy
    .
    .
|-- views
    |-- partials
    |-- content
|-- .env
|-- .env.template
|-- app.js
|-- README.md

Вам должно быть интересно, почему файлы .env? Потому что они работают! Я использую модуль dotenv в своих проектах (много недавно), и он работает! Вставьте эти 2 утверждения в app.js или www

var dotenv = require('dotenv');
dotenv.config({path: path.join(__dirname + "/.env")});

И еще одна строка для быстрой установки /bower_components для обслуживания статического контента под ресурсом /ext

app.use('/ext', express.static(path.join(__dirname, 'bower_components')));

Вероятно, это может подойти людям, которые хотят использовать Express и Angular вместе, или просто выразить без этой javascripts иерархии, конечно.

0 голосов
/ 06 декабря 2018

Простой способ структурировать ваше экспресс-приложение:

  • В main index.js должен поддерживаться следующий порядок.

    all app.set должен быть первым.

    all app.use должен быть вторым.

    , за которым следуют другие apis с их функциями или route-continue inдругие файлы

    Пример

    app.use ("/ password", passwordApi);

    app.use ("/ user", userApi);

    app.post ("/ token", passport.createToken);

    app.post ("/ logout", passport.logout)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...