Hapi.js应用程序架构

时间:2015-03-23 19:01:09

标签: hapijs

我一直在研究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和其他资源的官方网站,但无法找到任何有趣的内容。

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

2 个答案:

答案 0 :(得分:7)

关于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构建的一些项目,并了解他们是如何进行的:

答案 1 :(得分:3)

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

  1. 将实体的控制器/验证器和路由分组到一个文件夹中。
  2. 将公用文件夹中的实用程序分组。
  3. 将auth和相关任务保存在单独的文件夹中。
  4. 为引导任务保留单独的文件夹。
  5. 使用index.js对每个文件夹进行分组,该文件充当文件夹
  6. 中所有文件的粘合剂
  7. 为每个文件夹添加package.json以避免相对路径访问。
  8. 使用 dotenv 加载环境变量。
  9. 模块化的灵感来自我在几个地方读过的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