从另一条路线呼叫hapi路线

Fel*_*lix 7 javascript node.js hapijs

我对HapiJS很新.我正在构建一个服务,我有两个路由/ route1和/ route2都使用插件架构.我已在我的清单文件中注册了两个插件.

我想从/ route2调用/ route1,因此/ route2取决于/ route1的有效负载回复.我一直在考虑将/ route2的逻辑放在预处理程序上的/ route1上,但我想将它们分开保存.

不知道如何从另一个调用注册的插件,因为两个插件(路由)正在发出网络请求.谢谢阅读.

谢谢.

Mat*_*son 13

当您指定不想使用共享处理程序/路由先决条件(这是我的第一选择)时,您可以使用http客户端(Wreck,request,http等)发出实际请求.

另一种不涉及实际发出网络请求的更有效的方法是使用server.inject()Shot提供的hapi的内置方法.这将向您的服务器注入一个请求并获取您可以使用的响应.这是一个例子:

var Hapi = require('hapi');

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

var plugin1 = function (server, options, next) {

    server.route({
        method: 'GET',
        path: '/route1',
        handler: function (request, reply) {

            reply('Hello');
        }
    });

    next();
};

plugin1.attributes = { name: 'plugin1' };

var plugin2 = function (server, options, next) {

    server.route({
        method: 'GET',
        path: '/route2',
        handler: function (request, reply) {

            server.inject('/route1', function (res) {

                reply(res.payload + ' World!');
            });
        }
    });

    next();
};

plugin2.attributes = { name: 'plugin2' };

server.register([plugin1, plugin2], function (err) {

    if (err) throw err;
    server.start(function (err) {
        if (err) throw err;
        console.log('Started');
    });
});
Run Code Online (Sandbox Code Playgroud)

请注意,路由在插件中的事实是无关紧要的.我只是把它包括在内,所以它接近你的情况.

镜头server.inject()主要用于测试,但也有合法的运行时用途.

如果你发出请求/route2,这将调用/route1处理程序并获取有效负载:

$ curl localhost:4000/route2
Hello World!
Run Code Online (Sandbox Code Playgroud)