Префикс глобального пути HapiJS

Я пишу API на HapiJS и задаюсь вопросом, как получить глобальный префикс. Например, все запросы должны быть сделаны:

https://api.mysite.com/v0/...

Поэтому я хотел бы настроить v0 как глобальный префикс. Документы (здесь), похоже, не упоминают об этом - есть ли хороший способ сделать это в HapiJS?

Ответ 1

Если вы поместите свою логику маршрутизации 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'
};

Вы регистрируете плагин на сервере и передаете дополнительный префикс маршрута, который будет добавлен ко всем вашим маршрутам внутри плагина:

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

});

Это можно проверить, запустив сервер и посетив http://localhost:3000/v0/hello.

Ответ 2

Мне удалось заставить его работать для всех маршрутов с помощью

var server = new Hapi.Server()
...
server.realm.modifiers.route.prefix = '/v0'
server.route(...)

Ответ 3

Ответ 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));

Хорошо, что с помощью чего-то подобного вы можете выполнить express -подобный монтаж. ex:

 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")));

Ответ 4

вы всегда можете запустить свой index.js, как этот

if (!global.PREFIX) {
  global.PREFIX = '/v0';
}

таким образом везде внутри вашего кода у вас будет доступ к PREFIX

что вы можете получить доступ к PREFIX

console.log(PREFIX); или var name = PREFIX+ "_somename";