Подтвердить что ты не робот

Архитектура приложения 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, но я начинаю с нового приложения и задаюсь вопросом, есть ли ресурсы, где я могу найти лучшую структуру приложения? Я просмотрел официальный сайт для хапи и других ресурсов, но не нашел ничего интересного.

Любая помощь оценивается. Спасибо.

4b9b3361

Ответ 1

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

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

models - только не-hapi конкретные node модули, которые говорят с вашим db

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 - модули, которые экспортируют схемы joi

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

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

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

Ответ 2

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

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

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

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

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