2015-03-27 6 views
10

Sto provando a migrare la mia app Express su hapi.js e ho problemi con i miei percorsi. Voglio solo 2 GET: il mio indice '/', e tutto ciò che non è '/' per reindirizzare a '/'.hapi.js - 404 route VS file statici route

Utilizzando espresso ho avuto questo:

// static files 
app.use(express.static(__dirname + '/public')); 

// index route 
app.get('/', function (req, res) { 
    // whatever 
} 

// everything that is not/
app.get('*', function(req, res) { 
    res.redirect('/'); 
}); 

ho problemi con hapi.js per ottenere lo stesso comportamento. La mia "strada statico" si presenta così:

server.route({ 
    method: 'GET', 
    path: '/{path*}', 
    handler: { 
    directory: { 
     path: 'public', 
     listing: false 
    } 
    } 
}); 

e la mia "404 su strada" sarebbe:

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

e ottengo questo errore:

Error: New route /{path*} conflicts with existing /{path*} 

Come posso risolvere questo ?

risposta

12

Stai definendo 2 percorsi con lo stesso metodo e percorso, che è un conflitto per quanto riguarda il router di hapi. Ecco perché stai ricevendo l'errore.

Se un file non viene trovato dal gestore directory, risponderà automaticamente con un errore 404.

Quello che puoi fare è intercettare questo con un gestore onPreReponse, che controlla se la risposta è una risposta di errore (un oggetto Boom), e se così risponda come desideri. Nel tuo caso reindirizzando a /:

  • richiesta del ciclo di vita e di estensione punti di Hapi::

    var Hapi = require('hapi'); 
    
    var server = new Hapi.Server(); 
    server.connection({ port: 4000 }); 
    
    server.route([{ 
         method: 'GET', 
         path: '/', 
         handler: function (request, reply) { 
    
          reply('Welcome home!'); 
         } 
        }, { 
         method: 'GET', 
         path: '/{p*}', 
         handler: { 
          directory: { 
           path: 'public', 
           listing: false 
          } 
         } 
        } 
    ]); 
    
    server.ext('onPreResponse', function (request, reply) { 
    
        if (request.response.isBoom) { 
         // Inspect the response here, perhaps see if it's a 404? 
         return reply.redirect('/'); 
        } 
    
        return reply.continue(); 
    }); 
    
    
    server.start(function() { 
        console.log('Started server'); 
    }); 
    

    letture consigliate http://hapijs.com/api#request-lifecycle

  • L'oggetto risposta: http://hapijs.com/api#response-object
+0

Grazie per la risposta, Mi piace il tuo approccio per gestire il codice di stato. Tuttavia, per guadagnare tempo, ho scelto di cambiare il mio percorso statico per eliminare conflits con 404. –

+0

@ThibaudTallon, penso che sia sicuramente un'idea saggia, se la tua applicazione lo consente. Sebbene i punti di estensione siano potenti, credo sia una buona idea minimizzare il loro utilizzo. –