2014-04-13 5 views
5

मैं एक्सप्रेस फ्रेमवर्क ऐप के साथ उल्का करने के लिए एक node.js को बदलने की कोशिश कर रहा हूं। मूलतः https://github.com/onmodulus/demeteorizerक्या एक एक्सप्रेस ऐप को उल्का में बदलने का कोई आसान तरीका है?

+0

शायद में एक्सप्रेस ऐप और उल्का ऐप बनाने के मॉडल के रूप में कोई भी स्वचालित तरीका बहुत अलग है। – imslavko

+4

मुझे नहीं पता कि ये लोग किस प्रश्न को ध्वजांकित करते हैं। मेरे लिए यह सवाल है कि सवाल क्या है। अगर ऐसा नहीं होता तो मैं इसका जवाब कैसे दे पाऊंगा? स्पष्ट होने के लिए एक प्रश्न को लंबे समय तक होने की आवश्यकता नहीं है। –

उत्तर

8

निश्चित रूप से स्वचालित रूप से नहीं की रिवर्स रास्ता कर रही है, लेकिन चाल का एक समूह आप श्रृंखला के लिए एक साथ कर सकते हैं लगभग यह स्वचालित रूप से प्राप्त कर रहे हैं।

मैं बस इतना ही कर रहा हूं और यहां इसके लिए मेरी सभी चालें हैं।

चलो अपने एक्सप्रेस ऐप मुख्य .js फ़ाइल से शुरू करते हैं।

/server/main.js: यह एक आप शीर्ष पर निम्न जोड़ने की जरूरत है

routes = {}; 
var app = { 
    get: function(route, foo) { 
     // routes.get[route] = foo; 
     routes[route] = foo; 
    }, 
    all: function(route, foo) { 
     // routes.all[route] = foo; 
     routes[route] = foo; 
    } 
}; 

सभी इस करता app कार्यों की जरूरत है, एक वस्तु के रूप में परिभाषित मार्गों को परिभाषित है, और रिकॉर्ड करने के लिए जो हम बाद में करेंगे है iron-router का उपयोग करके उन मार्गों को परिभाषित करने के लिए उपयोग करें। तो यह सुनिश्चित करें कि निम्नलिखित तरह बातें routes में दर्ज हो बनाता है:

/server/main.js:

app.get('/show', function(req, res) { 
    res.render('mytemplate'); 
}); 

वास्तव में मुख्य चाल है यही कारण है कि। यहां से सिर्फ श्रम पर।

अच्छी उल्का शैली में, हम सभी रूट रेंडरिंग कॉल को फाइबर में लपेटेंगे, ताकि उन्हें उल्का सर्वर पर अन्य सभी की तरह समकालिक बना दिया जा सके। इसके लिए, हम एक रैपिंग फ़ंक्शन waiter परिभाषित करते हैं कि हम मार्ग कार्यों को लपेटने के लिए बार-बार उपयोग कर सकते हैं। और जब हम इसे जोड़ते हैं, हम कनेक्ट अनुरोध और प्रतिक्रिया को मालिश करेंगे कि हम उल्का सर्वर पर लोहे के मार्गों से res और req ऑब्जेक्ट एक्सप्रेस में देखना चाहते हैं। आपको याद है: यह किसी भी खिंचाव से पूरा नहीं है। यह केवल उन हस्ताक्षर हैं जिन्हें मैं इन वस्तुओं से उपयोग करना चाहता था।

/server/main.js:

/** create an sync version for meteor */ 
waiter = function(foo, req, res) { 
    var waiter_aux = Meteor._wrapAsync(function(foo, req, res, callback) { 

     res.set = function(header, value) { 
      res.setHeader(header, value); 
     }; 

     res.send = function(codeorhtml, html) { 
      if (html) { 
       // two arguments provided, treat as described 
       res.statusCode = codeorhtml; 
      } else { 
       // no code, just html 
       html = codeorhtml; 
      } 
      callback(null, html); 
     }; 

     res.render = function(name, data, callback) { 
      callback = callback || function(err, html) { 
       res.send(html); 
      }; 

      var html = Handlebars.templates[name](data); 
      callback(null, html); 
     }; 

     res.json = function(object) { 
      res.send(JSON.stringify(object)); 
     } 

     res.redirect = function(URL) { 
      res.writeHead(302, { 
       'Location': URL 
      }); 
      res.end(); 
     }; 

     req.header = function(x) { 
      return this.header[x]; 
     }; 

     TemplatesObject = Handlebars.templates; 

     // these objects need to be extended further 
     foo(req, res); 
    }); 

    return waiter_aux(foo, req, res); 
}; 

अंत में, असली सौदा: प्रत्येक निर्दिष्ट एक्सप्रेस मार्ग के लिए मार्गों का निर्माण। इसके लिए हम iron-router का उपयोग करेंगे। निम्नलिखित कोड प्रत्येक परिभाषित मार्ग (हमारे नए सिरे से परिभाषित app कार्यों से पकड़ा और routes में संग्रहीत) के माध्यम से जाना होगा, और हमारे waiter का उपयोग कर एक फाइबर में लपेट, जो भी this.request/this.response और req और res वस्तुओं के बीच अनुवाद करने का ख्याल रखना होगा व्यक्त एप्स मानते हैं।

/routes.js:

if (Meteor.isServer) { 
    // create routes for all the app.get's and app.all's in bibbase.js 
    // (server) 
    console.log("setting routes:", routes); 
    _.each(routes, function(foo, route) { 
     Router.map(function() { 
      this.route(route, { 
       path: route, 
       where: 'server', 
       action: function() { 
        this.request.params = this.params; 
        var html = waiter(foo, this.request, this.response); 
        if (!this.response.statusCode) { 
         this.response.statusCode = 200; 
        } 
        if (!this.response.getHeader('Content-Type')) { 
         this.response 
          .setHeader('Content-Type', 'text/html'); 
        } 
        this.response.end(html); 
       } 
      }); 
     }); 
    }); 

} 

इन सबसे आवश्यक चीजें मैं पूरा करने के लिए आप क्या बारे में पूछ रहे हैं किया है। मुझे यकीन है कि मैंने यहां कुछ विवरण याद किए हैं, लेकिन इससे आपको एक विचार देना चाहिए।बाद Spacebars के लिए


अद्यतन (मैं उल्का का कौन सा संस्करण था कि भूल जाते हैं):

आदेश में यह काम करने के लिए, अब आप handlebars-server जोड़ने की जरूरत:

meteor add cmather:handlebars-server 
नहीं
+0

यह एक बहुत ही प्रभावशाली उत्तर है! – imslavko

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

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