2012-10-04 12 views
28

में अन्य मार्गों में पहले से परिभाषित मार्गों को कॉल करना मैं एक्सप्रेस का उपयोग करके node.js में एक वेब ऐप लिख रहा हूं। मैंने निम्नानुसार एक मार्ग परिभाषित किया है:एक्सप्रेस नोडजेएस

app.get("/firstService/:query", function(req,res){ 
    //trivial example 
    var html = "<html><body></body></html>"; 
    res.end(html) 
}); 

मैं उस मार्ग को एक्सप्रेस के भीतर से कैसे उपयोग करूं?

app.get("/secondService/:query", function(req,res){ 
    var data = app.call("/firstService/"+query); 
    //do something with the data 
    res.end(data); 
}); 

मैं API दस्तावेज़ों में कुछ भी नहीं मिला और नहीं बल्कि "अनुरोध" की तरह एक और पुस्तकालय का उपयोग नहीं करेंगे, क्योंकि है कि kludgey लगता है। मैं अपने ऐप को जितना संभव हो मॉड्यूलर रखने की कोशिश कर रहा हूं। विचार?

धन्यवाद

उत्तर

13

आप बस यह एक और समारोह में बाहर तोड़, यह एक साझा स्थान में डाल दिया और वहाँ से जा सकते हैं?

var queryHandler = require('special_query_handler'); 
// contains a method called firstService(req, res); 

app.get('/firstService/:query', queryHandler.firstService); 

// second app 
app.get('/secondService/:query', queryHandler.secondService); 

सच में, कॉल बैक app.get(...) के अंदर घोंसला बनाने के इस पूरे कारोबार वास्तव में एक महान प्रथा नहीं है। आप एक विशाल फ़ाइल के साथ समाप्त होते हैं जिसमें सभी कोर कोड होते हैं।

आप वास्तव में क्या चाहते हैं app.get() और app.post() से भरे फ़ाइल को अलग-अलग, बेहतर संगठित फ़ाइलों में रहने वाले सभी कॉलबैक हैंडलर के साथ बयान दिया गया है।

+1

धन्यवाद! मैं सिर्फ एक एक्सप्रेस शुरुआत करने वाला हूं जो एक परियोजना पर एक संभाल पाने की कोशिश कर रहा है जो अनावश्यक हो रहा है। इंटरमीडिएट के लिए उन्नत एक्सप्रेस ट्यूटोरियल/सहायता साइटों के लिए कोई सुझाव? – user1148710

21

गेट्स ने जो कहा, उसके समान, लेकिन मैं आपकी मार्ग फ़ाइल में function(req, res){} रखूंगा। तो मैं इस के बजाय की तरह कुछ करना होगा:

routes.js

var myModule = require('myModule'); 

app.get("/firstService/:query", function(req,res){ 
    var html = myModule.firstService(query); 
    res.end(html) 
}); 

app.get("/secondService/:query", function(req,res){ 
    var data = myModule.secondService(query); 
    res.end(data); 
}); 

और फिर अपने मॉड्यूल में अपने तर्क इतने तरह अलग है:

myModule.js

var MyModule = function() { 
    var firstService= function(queryParam) { 
     var html = "<html><body></body></html>"; 
     return html; 
    } 

    var secondService= function(queryParam) { 
     var data = firstService(queryParam); 
     // do something with the data 
     return data; 
    } 

    return { 
     firstService: firstService 
     ,secondService: secondService 
    } 
}(); 

module.exports = MyModule; 
0

आप run-middleware मॉड्यूल का उपयोग उस

app.runMiddleware('/firstService/query',function(responseCode,body,headers){ 
    // Your code here 
}) 
के लिए कर सकते हैं

और जानकारी:

प्रकटीकरण: मैं मेंटेनर & इस मॉड्यूल के पहले डेवलपर हूँ। userpage.js

router.createSitemap = function(req, res, callback) { code here callback(value); } 

product.js पर पर :

+0

क्या इसका उपयोग राउटर के साथ किया जा सकता है और यदि ऐसा है तो मैं दिखाए गए उदाहरण बनाम ऐसा कैसे करूं? धन्यवाद! – Shaun

+0

मॉर्गन मार्ग की गलत जानकारी दिखा रहा है जिसे रन-मिडलवेयर द्वारा बुलाया जाता है। किसी भी मदद @aminadav –

3

आप अपने मार्ग पर मिडलवेयर का एक बहुत है, तो आप को फैलने से फायदा हो सकता है:

const router = express.Router(); 

const myMiddleware = [ 
    authenticationMiddleware(), 
    validityCheckMiddleware(), 
    myActualRequestHandler 
]; 

router.get("/foo", ...myMiddleware); 
router.get("/v1/foo", ...myMiddleware); 
+1

प्रति http://expressjs.com/en/guide/routing.html उदाहरण: 'app.get ('/ example/c', [cb0, cb1, cb2]) ', ऐसा लगता है कि आप नहीं करते स्प्रेड ऑपरेटर की भी आवश्यकता है। किसी भी तरह से जानना अच्छा लगा! – ryanm

+0

@ryanm हू। अच्छा पकड़ा! –

0

मैं का इस्तेमाल किया है जिस तरह से निम्नलिखित

var userPageRouter = require('userpages'); 
userPageRouter.createSitemap(req, res, function() { 
          //console.log('sitemap'); 
         }); 

इसके अलावा एक ही userpage.js रूटर में उपयोग कर सकते हैं मैं दूसरे रूटिंग के लिए उपयोग कर सकते हैं कुंआ। जैसे।

router.get('/sitemap', function (req, res, next) { 
    router.createSitemap(req, res, function() { 
     res.redirect('/sitemap.xml'); 
    }); }); 

आशा है कि इससे मदद मिलेगी।

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