2015-03-27 15 views
10

Ich versuche, meine Express-App zu hapi.js zu migrieren, und ich habe Probleme mit meinen Routen. Ich möchte nur 2 GET: mein Index '/', und alles, was nicht '/' auf '/' umleiten.hapi.js - 404 Route VS statische Dateien Route

Express verwenden hatte ich dies:

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

Ich habe Probleme mit hapi.js das gleiche Verhalten zu bekommen. Meine "statische Straße" sieht wie folgt aus:

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

und meine "404 road" wäre:

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

und ich bekomme diese Fehlermeldung:

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

Wie kann ich dieses Problem lösen ?

Antwort

12

Sie definieren 2 Routen mit der gleichen Methode und Pfad, was ein Konflikt ist, was hapi's Router angeht. Deshalb erhalten Sie den Fehler.

Wenn eine Datei vom directory-Handler nicht gefunden wird, wird standardmäßig ein Fehler 404 angezeigt.

Sie können dies mit einem onPreReponse Handler abfangen, der überprüft, ob die Antwort eine Fehlerantwort ist (ein Boom Objekt), und wenn ja, wie auch immer Sie wünschen. In Ihrem Fall von / zu Umleitung:

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

Lesung Empfehlung:

+0

Vielen Dank für Ihre Antwort, Ich mag Ihren Ansatz, um mit Statuscode umzugehen. Um Zeit zu gewinnen, entschied ich mich, meinen statischen Pfad zu ändern, um conflits mit 404 zu löschen. –

+0

@ThibaudTallon, ich denke, das ist definitiv eine kluge Idee, wenn Ihre Anwendung es erlaubt. Obwohl Erweiterungspunkte leistungsstark sind, ist es eine gute Idee, ihre Verwendung zu minimieren, denke ich. –

Verwandte Themen