web-dev-qa-db-ja.com

ルートにミドルウェアを追加するにはどうすればよいですか?

急いで私はこのようなものを持っています:

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

Hapiのミドルウェアのフォームは何ですか?私がこれを持っているとき:

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

ルートpreオプションを使用すると、このようなプリハンドラーメソッドを定義できます。 http://hapijs.com/api#routeをご覧ください) -前提条件

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');
        }
    }
});
12
Chung Nguyen

server.ext プロパティを使用して、 使用可能な拡張ポイント の1つに拡張関数を登録できます。

例えば:

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

この機能は便利かもしれません。それはすべて、ミドルウェアで何をしたいかによって異なります。

9
gastonmancini

@gastonmanciniの回答に加えて、v17以降を使用している場合は、次のものを使用することをお勧めします。

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

hapi docs によると:

"続行するには、reply.continue()の代わりにh.continueを返します応答を変更せずに。」

8
Idan Dagan

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;
            },

        }
    },
0
Ashutosh Kumar