2015-03-27 21 views
10

मैं अपने एक्सप्रेस ऐप को hapi.js में माइग्रेट करने का प्रयास कर रहा हूं, और मुझे अपने मार्गों में परेशानी है। मुझे बस 2 जीईटी चाहिए: मेरी अनुक्रमणिका '/', और वह सब कुछ जो '/' पर '/' पर रीडायरेक्ट नहीं है।hapi.js - 404 मार्ग वीएस स्थैतिक फाइल मार्ग

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

मैं hapi.js के साथ मुद्दों समान व्यवहार प्राप्त करने के लिए है:

एक्सप्रेस का उपयोग करते हुए मैं इस किया था। मेरे "स्थिर सड़क" इस तरह दिखता है:

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

और मेरे "404 सड़क" होगा:

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

और मैं इस त्रुटि मिलती है:

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

मैं इस हल कर सकते हैं कैसे ?

उत्तर

12

आप एक ही विधि और पथ के साथ 2 मार्गों को परिभाषित कर रहे हैं, जो हैपी के राउटर के संबंध में एक संघर्ष है। यही कारण है कि आपको त्रुटि मिल रही है।

यदि फ़ाइल directory हैंडलर द्वारा नहीं मिली है, तो यह डिफ़ॉल्ट रूप से 404 त्रुटि के साथ प्रतिक्रिया देगी।

आप क्या कर सकते एक onPreReponse हैंडलर, जो अगर प्रतिक्रिया एक त्रुटि प्रतिक्रिया (एक Boom वस्तु) है की जाँच करता है के साथ इस अवरोधन है, और इसलिए हालांकि प्रतिक्रिया यदि आप चाहें तो। / के लिए पुनः निर्देशित करके अपने मामले में:

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

सिफारिश की पठन:

+0

अपने जवाब के लिए धन्यवाद, मुझे स्टेटस कोड से निपटने के लिए आपका दृष्टिकोण पसंद है। हालांकि, समय हासिल करने के लिए, मैंने 404 के साथ conflits को हटाने के लिए अपना स्थिर पथ बदलना चुना। –

+0

@ThibaudTallon, मुझे लगता है कि यह निश्चित रूप से एक बुद्धिमान विचार है, यदि आपका एप्लिकेशन इसे अनुमति देता है। हालांकि विस्तार बिंदु शक्तिशाली हैं, लेकिन मेरे विचार को कम करने के लिए यह एक अच्छा विचार है। –

संबंधित मुद्दे