2015-03-27 18 views
10

Express uygulamamı hapi.js'ye taşımaya çalışıyorum ve rotalarımda sorun yaşıyorum. Sadece 2 GET istiyorum: dizinim '/' ve '/' ile '/' arasında yönlendirilecek olmayan her şey.hapi.js - 404 rota VS statik dosyaları rotası

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

aynı davranışı elde etmek hapi.js ile ilgili sorunlar:

Express'i kullanma Bunu vardı. Benim "statik yol" şuna benzer:

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

ve benim "404 yol" olacağını:

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

ve bu hatayı alıyorum:

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

Bunu çözmek nasıl ?

cevap

12

Aynı yöntem ve yolla 2 yolu tanımlıyorsunuz, bu da hatanın yönlendiricisine göre bir çakışmadır. Bu yüzden hatayı alıyorsun.

directory işleyicisi tarafından bir dosya bulunamazsa, bu varsayılan olarak 404 hatasıyla yanıt verir.

Yapabilecekleriniz, yanıtın bir hata yanıtı olup olmadığını (Boom nesnesi) kontrol eden ve isterseniz yanıt verirseniz, bunu onPreReponse işleyicisiyle kesiştirmektir. / yönlendirme yaparak Senin durumunda:

  • Hapi talebi yaşam döngüsü ve uzatma puanı:

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

    okuma Önerilen http://hapijs.com/api#request-lifecycle

  • yanıt nesnesi: Cevabınız için http://hapijs.com/api#response-object
+0

sayesinde, Durum koduyla uğraşmak için yaklaşımınızı seviyorum. Ancak, zaman kazanmak için, 404 ile conflitleri silmek için statik yolumu değiştirmeyi seçtim. –

+0

@ThibaudTallon, uygulamanızın izin vermesi durumunda kesinlikle akıllıca bir fikir olduğunu düşünüyorum. Uzantı noktaları güçlü olmasına rağmen, kullanımlarını en aza indirmek için iyi bir fikir olduğunu düşünüyorum. –

İlgili konular