2014-04-13 11 views
5

Ich versuche, eine node.js mit Express Framework App zu Meteor zu konvertieren. tun den umgekehrten Weg von https://github.com/onmodulus/demeteorizerGibt es eine einfache Möglichkeit, eine Express-App in Meteor zu konvertieren?

+0

wahrscheinlich nicht in jeden automatisierten Weg, da die Modelle der Express App und Meteor App so unterschiedlich sind. – imslavko

+4

Ich weiß nicht, was diese Leute, die die Frage markiert haben wollen. Für mich ist es ziemlich klar, was die Frage ist. Wenn es nicht gewesen wäre, wie hätte ich dann antworten können? Eine Frage muss nicht lange sein, um klar zu sein. –

Antwort

8

Definitiv Wesentlichen nicht automatisch, aber es gibt ein paar Tricks, die Sie können Kette zusammen fast automatisch erhalten.

Ich habe genau das durchgemacht und hier sind alle meine Tricks dafür.

Beginnen wir mit Ihrer Express-App-Hauptdatei .js. Dieses benötigen Sie folgende an der Spitze hinzuzufügen:

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

All dies die app Funktionen definieren ist, was Sie brauchen, und notieren Sie die definierten Routen in einem Objekt, dem wir später Verwenden Sie diese Routen mit iron-router. So macht es sicher, dass Dinge wie die folgenden in routes aufgezeichnet erhalten:

/server/main.js:

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

Das ist eigentlich der Haupt Trick. Von hier an ist es nur Arbeit.

Im guten Meteor-Stil werden wir alle Route-Rendering-Aufrufe in eine Glasfaser umwandeln, um sie wie alles andere auf dem Meteorserver synchron zu machen. Dazu definieren wir eine Wrapping-Funktion waiter, die wir immer wieder verwenden können, um die Routenfunktionen zu umbrechen. Und während wir es hinzufügen, werden wir die Verbindungsanfrage und die Antwort, die wir von den Eisenrouten auf dem Meteorserver erhalten werden, in die res und req Objekte, die Express sehen möchte, massieren. Wohlgemerkt: Dies ist noch nicht abgeschlossen. Es sind nur die Signaturen, die ich von diesen Objekten verwenden wollte.

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

schließlich die eigentliche Behandlung: Routen für jede angegebene Schnellstraße zu schaffen. Dafür verwenden wir iron-router. Der folgende Code wird durch jede definierte Strecke (von unseren neu definiert app Funktionen gefangen und gespeichert in routes) gehen, und wickeln Sie es in einer Faser unsere waiter verwenden, was auch darauf achten, zwischen this.request/this.response des Übersetzens und der req und res Objekte äußern apps annehmen.

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

} 

Dies sind die wichtigsten Dinge, die ich getan habe, um zu erreichen, was Sie fragen. Ich bin mir sicher, dass ich ein paar Details verpasst habe, aber das sollte dir eine Idee geben.


Update für post-Spacebar (I vergessen, welche Version von Meteor, das war):

Um diese Arbeit zu machen, müssen Sie jetzt handlebars-server hinzuzufügen:

meteor add cmather:handlebars-server 
+0

das ist eine sehr beeindruckende Antwort! – imslavko

Verwandte Themen