2015-03-23 3 views
12

Я работал на hapi.js приложения и имеет следующую архитектуру:Hapi.js архитектура приложения

Database 
    --Models 
    --usermodel.js 
    --anothermodel.js 
Routes 
    --private 
    --controllers 
     --ctrl1.js 
     --ctrl2.js 
    --validators 
     --validatr1.js 
     --validtr2.js 
    --public 
    --controllers 
     --ctrl1.js 
     --ctrl2.js 
test 
    --dbtest.js 
    --functiontest.js 
server.js 

Мы приняли эту структуру, при работе с express, но я начинаю с новым приложением и было интересно, есть ли ресурсы, где я могу найти лучшую структуру приложения? Я изучил официальный сайт хапи и других ресурсов, но не нашел ничего интересного.

Любая помощь приветствуется. Благодарю.

+0

Обычно они помещают весь исходный код внутри де '/ lib' папки. Вот пример приложения, которое они используют для мастерских https://github.com/hapijs/hapchat – Osukaa

+0

Вы также можете использовать генератор йомана https://github.com/jedireza/generator-hapi-style – Osukaa

+0

«лучше» в каком смысле? –

ответ

7

Хорошая вещь о хапи заключается в том, что он не диктует вам, как вы должны структурировать свои приложения. Это зависит от вас, потому что имеет смысл в вашей жизни. You может выбросить все, что у вас есть, в одном файле index.js и еще использовать все функции hapi, но вам, вероятно, придется тяжело читать/поддерживать этот шарик позже.

Если эта структура выше, которую вы использовали ранее, по-прежнему имеет смысл для вашего приложения, абсолютно ничего не мешает вам использовать ту же или подобную структуру.

models - просто не-Хапите конкретные модули узла, которые поговорить с дб

exports.getUser = function (id, callback) { 

    Db.get('users', id, callback) 
}; 

controllers - модулей, которые экспортируют обработчик маршрута

var User = require('../models/user'); 

exports.showUserPage = function (request, reply) { 

    User.getUser(request.params.id, function (err, user) { 

     if (err) { 
      throw err; 
     } 

     if (!user) { 
      return reply('User not found').code(404) 
     } 

     reply.view('user', user); 
    }); 
} 

validators - модули, которые экспортируют дзе схемы

exports.showUserPage = { 
    params: { 
     id: Joi.number().required() 
    } 
} 

server.js - где вы склеить все это вместе

var Hapi = require('hapi'); 

var server = new Hapi.Server(); 
server.connection({ port: 7843 }); 

server.route({ 
    method: 'GET', 
    path: '/users/{id}', 
    handler: require('./controller/users').showUserPage, 
    config: { 
     validate: require('./validators/users').showUserPage 
    } 
}); 

server.start(); 

Плагины

Вы, вероятно, следует воспользоваться plugins, они позволяют разделить приложение на логические части. Вы все еще можете использовать указанную выше структуру, но поместите ее внутри плагина. Новые функции, которые вы добавите позже, могут попасть в другой плагин, если они не связаны (аналитика, хранилище и т. Д.). Это позволяет создавать архитектуру микросервиса, где легко масштабировать только те части приложений, которые нуждаются в масштабировании.

Что делают другие люди?

Если вы хотите, чтобы изменить его только потому, что вы можете, взглянуть на несколько проектов, уже построенных с Хапи, и посмотреть, как они делают это: веб-сайт

3

Я строил chat application и следующее, что я использовал:

  1. Групповые контроллеры/валидаторов и маршруты объекта в одну папку.
  2. Утилиты группы в общей папке.
  3. Сохранять auth и связанные задачи в отдельной папке.
  4. Храните отдельную папку для задач начальной загрузки.
  5. Группируйте каждую папку с помощью index.js, которая действует как клей для всех файлов в папке
  6. Добавьте package.json для каждой папки, чтобы избежать относительного доступа к пути.
  7. Используйте dotenv, чтобы загрузить переменные среды.

Модульности был вдохновлен принципами Углового стиля я прочитал на несколько местах, где акцент делается на группировку модулей по сущности вместо функциональных возможностей.

Ниже моя архитектура проекта:

auth 
-- index.js 
-- package.json 
modules 
    --user 
    --controller.js 
    --validator.js 
    --index.js 
    --group 
    --controller.js 
    --validator.js 
    --index.js 
    --index.js 
    --package.json 
database 
    --models 
    --user.js 
    --group.js 
    --index.js 
    --package.json 
bootstrap 
--users.js 
    --groups.js 
    --index.js 
    --package.json 
test 
    --user 
    --model.js 
    --route.js 
    --index.js 
    --index.js 
    --package.json 
app.js 
+0

Мне интересно, почему 'auth' не может быть внутри' modules'? –