2015-10-11 37 views
5

Sono abbastanza nuovo per HapiJS. Sto costruendo un servizio in cui ho due percorsi/route1 e/route2 entrambi utilizzano l'architettura dei plugin. Ho registrato entrambi come plugin sul mio file manifest.Chiamare una route di hapi da un'altra route

Voglio chiamare/route1 da/route2 così/route2 dipende dalla risposta del carico utile da/route1. Ho cercato di mettere la logica di/route2 su/route1 sul pre-gestore ma voglio tenerli separatamente.

Non so come chiamare un plug-in registrato da un altro il problema è che entrambi i plugin (route) stanno facendo richieste di rete. Grazie per aver letto.

Grazie.

risposta

8

Come si specifica che non si desidera utilizzare un gestore condiviso/percorso prerequisito (che sarebbe la mia prima scelta), si potrebbe fare una richiesta effettiva utilizzando un client http (Wreck, request, http o simili) .

Un altro modo più efficiente che non implica effettivamente l'esecuzione di una richiesta di rete consiste nell'utilizzare il metodo incorporato server.inject() di hapi fornito da Shot. Questo inietterà una richiesta al tuo server e riceverà la risposta, che puoi usare. Ecco un esempio:

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

Si noti che il fatto che i percorsi siano nei plugin qui è irrilevante. L'ho semplicemente incluso quindi è vicino alla tua situazione.

Shot e server.inject() vengono principalmente utilizzati per il test ma esistono anche usi di runtime legittimi come questo.

Se si effettua una richiesta per /route2, questo richiamerà /route1 gestore e ottenere il carico utile:

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

Nota che non le intestazioni a termine, lo status-code e potenziali errori se è questo che si vuole dare un'occhiata all'indirizzo https://github.com/hapijs/discuss/issues/297#issuecomment-255593684 – FGRibreau