Hapijs Hapi.js应用程序体系结构

Hapijs Hapi.js应用程序体系结构,hapijs,Hapijs,我一直在开发一个hapi.js应用程序,具有以下体系结构: Database --Models --usermodel.js --anothermodel.js Routes --private --controllers --ctrl1.js --ctrl2.js --validators --validatr1.js --validtr2.js --public --controllers

我一直在开发一个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
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 
我们在使用
express
时采用了这种结构,但我从一个新的应用程序开始,想知道是否有资源可以找到更好的应用程序结构?我在官方网站上查找了hapi和其他资源,但没有找到任何有趣的内容


谢谢你的帮助。谢谢。

hapi的好处在于它不会规定你应该如何构造你的应用程序。这取决于你,因为在你的生活中任何有意义的事情。你可以把你所有的东西都放在一个
index.js
文件中,并且仍然使用所有的hapi特性,但是你以后可能很难阅读/维护这个毛球

如果您以前使用过的上述结构对您的应用程序仍然有意义,那么绝对没有什么可以阻止您使用相同或类似的结构

型号
-只是与数据库通信的非hapi特定节点模块

exports.getUser = function (id, callback) { 

    Db.get('users', id, callback) 
};
控制器
- 导出路由处理程序的模块

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);
    });
}
验证程序
-导出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();
插件

您可能应该利用它们,它们允许您将应用程序拆分为逻辑块。您仍然可以使用上述结构,但可以将其放入插件中。如果以后添加的新功能与其他插件无关(分析、存储等),则可以将它们放入另一个插件中。这使您可以构建一个微服务体系结构,在该体系结构中,只需扩展应用程序中需要扩展的特定部分即可轻松实现

其他人在做什么?

如果你只是因为你能改变它,那么看看一些已经用hapi构建的项目,看看他们是如何做到的:

  • NPM网站:
  • PostFile应用程序(过期的hapi版本):
我一直在构建一个应用程序,以下是我使用的:

  • 将实体的控制器/验证器和路由分组到一个文件夹中
  • 将公用文件夹中的实用程序分组
  • 将身份验证和相关任务保存在单独的文件夹中
  • 为引导任务保留单独的文件夹
  • 使用index.js对每个文件夹进行分组,index.js充当文件夹中所有文件的粘合剂
  • 为每个文件夹添加package.json以避免相对路径访问
  • 使用dotenv加载环境变量
  • 模块化的灵感来自于我在一些地方读到的角度风格指南,其中重点是按实体对模块进行分组,而不是按功能进行分组

    以下是我的项目架构:

    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
    
    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 
    

    通常,他们将所有源代码放在de
    /lib
    文件夹中。这里有一个他们用于研讨会的示例应用程序,你也可以在什么意义上使用yeoman生成器“更好”?在某种意义上,它允许利用hapi.js功能。上面的结构深受express中间件的启发,我曾将它们创建为处理每个请求的层(验证器、控制器、清理等)。