HapiJS全局路径前缀

Tyl*_*ler 14 url-routing node.js hapijs

我正在HapiJS上编写API,并想知道如何获得全局前缀.例如,所有请求都应该:

https://api.mysite.com/v0/...
Run Code Online (Sandbox Code Playgroud)

所以我想配置v0为全局前缀.文档(这里)似乎没有提到它 - 在HapiJS中有一个很好的方法吗?

Mat*_*son 17

如果您将API路由逻辑放在Hapi插件中,请说./api.js:

exports.register = function (server, options, next) {

    server.route({
        method: 'GET',
        path: '/hello',
        handler: function (request, reply) {
            reply('World');
        }
    });

    next();

};

exports.register.attributes = {
    name: 'api',
    version: '0.0.0'
};
Run Code Online (Sandbox Code Playgroud)

您使用服务器注册插件并传递可选的路由前缀,该前缀将添加到插件内的所有路由:

var Hapi = require('hapi');

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

server.register({
    register: require('./api.js')
}, {
    routes: {
        prefix: '/v0'
    }
},
function(err) {

    if (err) {
        throw err;
    }

    server.start(function() {
        console.log('Server running on', server.info.uri)
    })

});
Run Code Online (Sandbox Code Playgroud)

您可以通过启动服务器和访问来验证这是否有效http://localhost:3000/v0/hello.

  • @MattHarrison用多插件免责声明更新你的答案可能是个好主意:) (3认同)
  • 我似乎无法使这种方法起作用.我可以直接使用`server.realm.modifiers.route.prefix ='/ v0'`设置它,但不能在显示时嵌套选项.你确定你的方法有效吗? (2认同)
  • 是的,我刚刚用 Hapi 8 测试了它。不过这个前缀选项仅在注册单个插件时可用。因此,如果您要注册多个插件,它将不起作用。 (2认同)

Tyl*_*ler 9

我能够让它适用于所有路线

var server = new Hapi.Server()
...
server.realm.modifiers.route.prefix = '/v0'
server.route(...)
Run Code Online (Sandbox Code Playgroud)


Adr*_*sbe 5

Matt Harrisson 的答案是使用插件的hapi方式。

或者,如果您不想创建插件只是为了添加前缀,您可以手动将前缀添加到所有路由中。

例如我做了这样的事情:

  var PREFIX = '/v0';
  var routes = [/* array with all your root */];

  var prefixize = function (route) {  route.path = PREFIX + route.path;return route; }
  server.route(routes.map(prefixize));
Run Code Online (Sandbox Code Playgroud)

好的一点是,有了这样的东西,你就可以执行express类似的安装。前任:

 var prefixize = function (prefix, route) {  route.path = prefix + route.path;return route; }

server.route(adminRoutes.map(prefixize.bind({}, "/admin"))); //currying.
server.route(apiRoutes.map(prefixize.bind({}, "/api")));
Run Code Online (Sandbox Code Playgroud)