Как я могу добавить промежуточное ПО в свой маршрут?

В экспрессе у меня есть что-то вроде этого:

router.get('/foo', middlewareFunction, function (req, res) {
    res.send('YoYo');
});

Какова форма промежуточного программного обеспечения в hapi? Когда у меня есть это:

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

person Antonio Sandoval    schedule 10.07.2015    source источник
comment
Что вы хотите сделать в промежуточном программном обеспечении?   -  person Gergo Erdosi    schedule 10.07.2015


Ответы (4)


Параметр маршрута pre позволяет определить такие методы предварительной обработки, см. http://hapijs.com/api#route-prerequisites

const Hapi = require('hapi');
const server = new Hapi.Server();
server.connection({ port: 80 });

const pre1 = function (request, reply) {

    return reply('Hello');
};

const pre2 = function (request, reply) {

    return reply('World');
};

const pre3 = function (request, reply) {

    return reply(request.pre.m1 + ' ' + request.pre.m2);
};

server.route({
    method: 'GET',
    path: '/',
    config: {
        pre: [
            [
                // m1 and m2 executed in parallel
                { method: pre1, assign: 'm1' },
                { method: pre2, assign: 'm2' }
            ],
            { method: pre3, assign: 'm3' },
        ],
        handler: function (request, reply) {

            return reply(request.pre.m3 + '\n');
        }
    }
});
person Chung Nguyen    schedule 12.08.2016
comment
Я знаю, что это вопрос новичка, но как остановить функцию 2, если, скажем, авторизация не удалась? - person Achmad Naufal Syafiq; 09.10.2017
comment
@AchmadNaufalSyafiq Согласно встроенному плагину аутентификации hapi, упомянутому здесь, он предоставляет функцию проверки, в которой вы можете определить свой такие действия, как токен поиска в базе данных и т. д. Вы регистрируете свои маршруты, которые будут использовать это промежуточное программное обеспечение, помещая объект аутентификации в параметры каждого маршрута. Я не рекомендую использовать для этого pre. - person mobby; 05.05.2018

Вы можете использовать свойство server.ext, чтобы зарегистрировать функцию расширения в одном из доступные точки расширения.

Например:

server.ext('onRequest', function (request, reply) {
    // do something
    return reply.continue();
});

Эта функция может быть полезна. Все зависит от того, что вы хотите делать с промежуточным программным обеспечением.

person gastonmancini    schedule 10.07.2015
comment
Конечно, я попробую с событием onPreHandler. - person Antonio Sandoval; 10.07.2015
comment
PS: continue это не функция. - person mustofa.id; 22.06.2021

В дополнение к ответу @gastonmancini, если вы используете v17 и выше, вы можете использовать:

server.ext('onRequest', (request, h) => {
    // do something
    return h.continue;
});

Согласно документам hapi:

«Верните h.continue вместо reply.continue(), чтобы продолжить без изменения ответа».

person Idan Dagan    schedule 19.12.2017

В Hapi v17 и выше вы можете использовать следующий код

const server = new Hapi.Server({
  host: settings.host,
  port: settings.port,
  routes: {cors: {origin: ['*'] } }
});

server.ext('onRequest',async (req, h)=>{
  req.firebase = 'admin'; // This adds firebase object to each req object in HAPI
  return h.continue; // This line is important
})

Теперь получите доступ к объекту req.firebase в ваших маршрутах следующим образом:

 {
        method: 'POST', 
        path: '/helper/admin-object', 
        options: {
            handler: async (req, h)=>{
                console.log(req.firebase); // Prints admin
                return true;
            },

        }
    },
person Ashutosh Kumar    schedule 01.07.2019