2014-04-13 25 views
5

Bir node.js'yi ekspres çerçeve uygulamasıyla meteor'a dönüştürmeye çalışıyorum. Esasen değil otomatik Kesinlikle https://github.com/onmodulus/demeteorizerEkspres bir uygulamayı meteor'a dönüştürmenin kolay bir yolu var mı?

+0

değil Express uygulaması ve Meteor uygulaması oluşturma modelleri çok farklı olduğundan herhangi bir otomatik yol. – imslavko

+4

Soruyu işaret eden bu kişilerin ne istediğini bilmiyorum. Bana göre, sorunun ne olduğu oldukça güzel. Eğer olmasaydı, nasıl cevap verebilirdim? Bir sorunun net olması için uzun olması gerekmiyor. –

cevap

8

ters şekilde yapıyor, ancak için birlikte zincir can hileler bir demet neredeyse otomatik olsun vardır.

Sadece bunun üzerinden geçtim ve işte bunun için tüm hilelerim.

Hızlı uygulama ana .js dosyanızla başlayalım.

/server/main.js: Bu bir üst kısımda aşağıdaki eklemem gerekiyor

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

Bütün bunlar hangi daha sonra olacak, bir nesnenin tanımlanmış yolları ihtiyacınız app işlevleri tanımlamak ve kayıt olduğunu mu Bu yolları iron-router kullanarak tanımlamak için kullanın. Yani bu aşağıdaki gibi şeyler routes kaydedilen olsun emin olur:

/server/main.js: gerçekten ana hüner var

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

. Buradan sadece emeği üzerine.

Meteor stilinde, meteor sunucusundaki her şey gibi eşzamanlı hale getirmek için tüm rota görüntülü aramaları bir fibere sarıyoruz. Bunun için, rota fonksiyonlarını sarmak için tekrar tekrar kullanabileceğimiz bir waiter sarma fonksiyonunu tanımlarız. Ve biz eklediğimizde, meteor sunucusundaki demir yollarından alacağımız bağlantı isteğini ve cevabını, görmek istediğiniz res ve req nesnelerine masaj yapacağız. Sakıncası: Bu herhangi bir streç ile tamamlanmış değil. Sadece bu nesnelerden kullanmak istediğim imzalar.

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

Son olarak, gerçek anlaşma: belirtilen her ekspres yol için yollar oluşturarak. Bunun için iron-router kullanacağız. Aşağıdaki kodu (bizim yeniden tanımlandı app fonksiyonları tarafından yakalanmış ve routes saklanan) her tanımlı rota üzerinden gitmek ve ayrıca ifade this.request/this.response ve req ve res nesneler arasında çeviri ilgilenir ki, bizim waiter kullanarak bir lif onu sarıp uygulamalar varsayalım.

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

} 

Bunlar Sorduğunuz başarmak için yaptığım en temel şeylerdir. Eminim birkaç detayı kaçırdım, ama bu sana bir fikir vermeli.Post-Spacebars için


Güncellemesi (ben Meteor hangi sürümünü unutma): Amacıyla

bu işi yapmak için, artık handlebars-server eklemeniz gerekir: muhtemelen

meteor add cmather:handlebars-server 
+0

bu çok etkileyici bir cevap! – imslavko

İlgili konular