【问题标题】:Hapi.js application architectureHapi.js 应用架构
【发布时间】:2015-05-26 22:00:46
【问题描述】:

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

任何帮助表示赞赏。谢谢。

【问题讨论】:

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

标签: hapijs


【解决方案1】:

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

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

models - 只是与您的数据库对话的非 hapi 特定节点模块

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

    我一直在构建chat application,以下是我使用过的:

    1. 将实体的控制器/验证器和路由组合到一个文件夹中。
    2. 公用文件夹中的组实用程序。
    3. 将身份验证和相关任务保存在单独的文件夹中。
    4. 为引导任务保留单独的文件夹。
    5. 使用 index.js 对每个文件夹进行分组,作为文件夹中所有文件的粘合剂
    6. 为每个文件夹添加 package.json 以避免相对路径访问。
    7. 使用 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 
    

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 1970-01-01
      • 2023-03-19
      • 2014-04-21
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多