2014-04-13 7 views
5

Próbuję przekonwertować plik node.js z aplikacją ramek ekspresowych na meteor. Zasadniczo robi odwrotny sposób https://github.com/onmodulus/demeteorizerCzy można łatwo przekonwertować aplikację ekspresową na meteor?

+0

prawdopodobnie w zautomatyzowany sposób, w jaki modele budowania aplikacji Express i Meteor są tak różne. – imslavko

+4

Nie wiem, czego chcą te osoby, które zgłosiły to pytanie. Dla mnie to całkiem sprytne, jakie jest pytanie. Gdyby tak nie było, w jaki sposób byłbym w stanie na nie odpowiedzieć? Pytanie nie musi być długie, aby było jasne. –

Odpowiedz

8

zdecydowanie nie automatycznie, ale istnieje kilka sztuczek można łańcuch razem prawie się to automatycznie.

przeszedłem tylko, że i tu są wszystkie moje sztuczki dla tego produktu.

Zacznijmy wyraźnej plik app główne .js. Ten jeden trzeba dodać następujące u góry:

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

Wszystko to nie jest określenie app funkcje potrzebne i nagrywać zdefiniowanych tras w obiekcie, który będziemy później użyj, aby zdefiniować te trasy, używając iron-router. Więc to daje pewność, że takie rzeczy jak poniżej nagrane w routes:

/server/main.js:

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

to naprawdę główny trik. Odtąd na jego sprawiedliwą pracę.

W dobrym stylu meteorów będziemy zawijać wszystkie renderingu połączenia tras w błonnik, aby uczynić je synchroniczne jak wszystko inne na serwerze meteorów. W tym celu definiujemy funkcję owijania waiter, którą możemy wielokrotnie wykorzystywać do zawijania funkcji trasy. I choć jesteśmy dodać, będziemy masować connect żądanie i odpowiedź, że trafimy z żelaza tras na serwerze meteorytów do res i req obiektów wyraźnej chcieliby zobaczyć. Pamiętaj: nie jest to kompletne w żadnym odcinku. To tylko podpisy, których chciałem użyć z tych obiektów.

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

Wreszcie prawdziwy rarytas: tworzenie tras dla każdej określonej drogi ekspresowej. Do tego użyjemy iron-router. Poniższy kod będzie przejść przez każdego zdefiniowanego trasie (złowione przez naszych przedefiniowanych app funkcji i przechowywane w routes) i owinąć go w błonnik Korzystanie z naszych waiter, który będzie również dbać o tłumaczenia między this.request/this.response i req i res obiektów wyrazić aplikacje przyjmują.

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

} 

Są to najbardziej podstawowe rzeczy robiłem, aby osiągnąć to, co prosicie o. Jestem pewien, że przegapiłem kilka szczegółów tutaj, ale to powinno dać ci pomysł.


Aktualizacja dla post-Spacebars (nie pamiętam która wersja Meteor to było):

aby uczynić tę pracę, teraz trzeba dodać handlebars-server:

meteor add cmather:handlebars-server 
nie
+0

To bardzo imponująca odpowiedź! – imslavko

Powiązane problemy