使用Hapi时如何在单独的文件中存储路由?

Cen*_*ion 50 routes node.js hapijs

所有Hapi示例(以及Express中的类似示例)都显示路由在起始文件中定义:

var Hapi = require('hapi');

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

server.route({
  method: 'GET',
  path: '/',
  handler: function (request, reply) {
    reply('Hello, world!');
  }
});

server.route({
  method: 'GET',
  path: '/{name}',
  handler: function (request, reply) {
    reply('Hello, ' + encodeURIComponent(request.params.name) + '!');
  }
});

server.start(function () {
  console.log('Server running at:', server.info.uri);
});
Run Code Online (Sandbox Code Playgroud)

但是,在实现具有大量不同路由的生产应用程序时,不难想象这个文件有多大.因此,我想分解路由,将它们分组并存储在单独的文件中,如UserRoutes.js,CartRoutes.js,然后将它们附加到主文件中(添加到服务器对象).您如何建议将其分开然后添加?

Ger*_*osi 90

您可以为用户路由(config/routes/user.js)创建单独的文件:

module.exports = [
    { method: 'GET', path: '/users', handler: function () {} },
    { method: 'GET', path: '/users/{id}', handler: function () {} }
];
Run Code Online (Sandbox Code Playgroud)

与购物车类似.然后在config/routes(config/routes/index.js)中创建一个索引文件:

var cart = require('./cart');
var user = require('./user');

module.exports = [].concat(cart, user);
Run Code Online (Sandbox Code Playgroud)

然后,您可以在主文件中加载此索引文件并调用server.route():

var routes = require('./config/routes');

...

server.route(routes);
Run Code Online (Sandbox Code Playgroud)

或者,config/routes/index.js而不是添加路径文件(例如cart,user)手动,可以动态加载它们:

const fs = require('fs');

let routes = [];

fs.readdirSync(__dirname)
  .filter(file => file != 'index.js')
  .forEach(file => {
    routes = routes.concat(require(`./${file}`))
  });

module.exports = routes;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,Gergo在这里所做的只是标准的Javascript,而不是Hapi特有的. (5认同)

coq*_*uin 15

你应该尝试Glue插件:https://github.com/hapijs/glue.它允许您模块化您的应用程序.您可以将路由放在单独的子目录中,然后将它们包含在Hapi.js插件中.您还可以使用Glue包含其他插件(Inert,Vision,Good)以及使用清单对象(或json文件)配置应用程序.

快速的例子:

server.js:

var Hapi = require('hapi');
var Glue = require('glue');

var manifest = {
    connections: [{
        port: 8080
    }],
    plugins: [
        { inert: [{}] },
        { vision: [{}] },
        { './index': null },
        {
            './api': [{
                routes: {
                    prefix: '/api/v1'
                }
            }]
        }
    ]
};


var options = {
    relativeTo: __dirname + '/modules'
};

Glue.compose(manifest, options, function (err, server) {
    server.start(function(err) {
        console.log('Server running at: %s://%s:%s', server.info.protocol, server.info.address, server.info.port);
    });
});
Run Code Online (Sandbox Code Playgroud)

./modules/index/index.js:

exports.register = function(server, options, next) {
    server.route({
        method: 'GET',
        path: '/',
        handler: require('./home')
    });
});

exports.register.attributes = {
    pkg: require('./package.json')
};
Run Code Online (Sandbox Code Playgroud)

./modules/index/package.json:

{
    "name": "IndexRoute",
    "version": "1.0.0"
}
Run Code Online (Sandbox Code Playgroud)

./modules/index/home.js:

exports.register = function(req, reply) {
    reply.view('home', { title: 'Awesome' });
});
Run Code Online (Sandbox Code Playgroud)

看看戴夫史蒂文斯的这篇精彩文章,了解更多细节和例子.


Bri*_*eil 6

您可以使用require-hapiroutes为您执行某些组织和加载.(我是作者所以我有点偏颇,我写这篇文章是为了让我的生活更轻松地管理路线)

我是require-directory的忠实粉丝,并希望能够轻松管理我的路由.这使您可以在路径中的模块和模块中混合和匹配路径.

然后你可以做这样的事......

var routes = require('./routes');
server.route(routes.routes);
Run Code Online (Sandbox Code Playgroud)

然后在你的目录中你可以有一个路由文件,如...

module.exports = [
{
  method : 'GET',
  path : '/route1',
  handler : routeHandler1,
  config : {
    description: 'my route description',
    notes: 'Important stuff to know about this route',
    tags : ['app']
  }
},
{
  method : 'GET',
  path : '/route2',
  handler : routeHandler2,
  config : {
    description: 'my route description',
    notes: 'Important stuff to know about this route',
    tags : ['app']
  }
}];
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过分配模块上的"routes"属性来混合和匹配

module.exports.routes = [
{
  method : 'GET',
  path : '/route1',
  handler : routeHandler1,
  config : {
    description: 'my route description',
    notes: 'Important stuff to know about this route',
    tags : ['app']
  }
},
{
  method : 'GET',
  path : '/route2',
  handler : routeHandler2,
  config : {
    description: 'my route description',
    notes: 'Important stuff to know about this route',
    tags : ['app']
  }
}];
Run Code Online (Sandbox Code Playgroud)

总是,很高兴有选择权.有关于githubnpmjs站点的完整文档.