2015-10-11 8 views
5

私はHapiJSにはかなり新しいです。私は2つのルート/ route1と/ route2の両方がプラグインアーキテクチャを使用しているサービスを構築しています。私は両方のプラグインをマニフェストファイルに登録しました。別のルートからhapiルートを呼び出す

/route2から/ route1をコールしたいので、/ route2は/ route1からのペイロード応答に依存します。私は/ route2のロジックをpre-handlerで/ route1に置いてみましたが、別々に保管したいと思います。

登録されたプラグインを別のプラグインから呼び出す方法がわからないのは、両方のプラグイン(ルート)がネットワーク要求を行っていることです。読んでくれてありがとう。

ありがとうございました。あなたは/ルート前提(私の最初の選択であると思われる)、あなたはHTTPクライアント(Wreckrequesthttpなど)を使用して、実際のリクエストを作ることができ、共有ハンドラを使用しないように指定したよう

答えて

8

実際にネットワーク要求を行わないもう1つのより効率的な方法は、Shotによって提供されるhapiの組み込みのserver.inject()メソッドを使用することです。これにより、サーバーにリクエストが注入され、使用できるレスポンスが取得されます。ここに例があります:

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

ここで、ルートがプラグインにあるという事実は無関係です。私はあなたの状況に近いので、単にそれを含めました。

ショットとserver.inject()が主にテストに使用されていますが、このように正当なランタイム使用もあります。

あなたは/route2に要求を行った場合、これは/route1ハンドラを起動し、ペイロードを取得します:それはあなたが見てみたいものだならば、それは、ヘッダー、ステータスコードおよび潜在的なエラーを転送しないことを

$ curl localhost:4000/route2 
Hello World! 
+0

注意https://github.com/hapijs/discuss/issues/297#issuecomment-255593684 – FGRibreau

関連する問題