2015-03-27 13 views
10

Próbuję przenieść moją aplikację Express do hapi.js i mam problem z moimi trasami. Chcę tylko 2 GET: mój indeks "/" i wszystko, co nie jest "/", aby przekierować do "/".hapi.js - 404 trasa VS pliki statyczne trasy

Korzystanie Express, miałem to:

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

mam problemy z hapi.js aby uzyskać takie samo zachowanie. Mój "static droga" wygląda następująco:

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

i moją "404 drogi" będzie:

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

i otrzymuję ten błąd:

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

Jak mogę rozwiązać ten problem ?

Odpowiedz

12

Definiując 2 trasy tą samą metodą i ścieżką, co jest konfliktem w odniesieniu do routera hapi. Właśnie dlatego otrzymujesz błąd.

Jeśli plik nie zostanie znaleziony przez program obsługi directory, domyślnie odpowiada on błędem 404.

Możesz przechwycić to za pomocą procedury obsługi onPreReponse, która sprawdza, czy odpowiedź jest odpowiedzią na błąd (obiekt Boom), a jeśli tak, odpowiedz jak chcesz. W twoim przypadku przekierowanie do /:

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

Zalecane lektury:

+0

Dzięki za odpowiedź, Podoba mi się twoje podejście do radzenia sobie z kodem statusu. Jednak, aby zyskać na czasie, postanowiłem zmienić swoją statyczną ścieżkę, aby usunąć konflikty z 404. –

+0

@ ThibaudTallon, myślę, że to zdecydowanie mądry pomysł, jeśli aplikacja na to pozwala. Mimo że punkty rozszerzeń są potężne, dobrym pomysłem jest zminimalizowanie ich użycia. –