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?
Antwort
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
das ist eine sehr beeindruckende Antwort! – imslavko
- 1. Gibt es eine einfache Möglichkeit, Kriterien in HQL zu konvertieren?
- 2. Gibt es eine einfache Möglichkeit, System.Data.DataTable in eine linq-Entität zu konvertieren?
- 3. Gibt es eine einfache Möglichkeit, Routing in JSF zu implementieren?
- 4. Gibt es eine einfache Möglichkeit, JavaScript in WebStorm zu bewerten?
- 5. Gibt es eine einfache Möglichkeit, Bildabmessungen in Ruby zu erhalten?
- 6. Gibt es eine einfache Möglichkeit, eine Tabelle in Prozedur umzubenennen?
- 7. Gibt es eine Möglichkeit, in URL Yii2 "+" in "-" zu konvertieren?
- 8. Gibt es eine einfache Möglichkeit, einen Socket zu einem SSLified Socket in C++ zu konvertieren?
- 9. Gibt es eine kostenlose Möglichkeit, RTF in PDF zu konvertieren?
- 10. Gibt es eine Möglichkeit, Funktionstyp in Haskell zu konvertieren?
- 11. Gibt es eine Möglichkeit, ein Array in Klasseneigenschaften zu konvertieren?
- 12. Gibt es eine einfache Möglichkeit, Text in JavaScript in HTML zu konvertieren?
- 13. gibt es eine einfache Möglichkeit, mein XML-Objekt zurück in String in Java zu konvertieren?
- 14. Gibt es eine einfache Möglichkeit, ein ASP.NET-Formular zu löschen?
- 15. Gibt es eine einfache Möglichkeit, jshint mit Netbeans zu integrieren?
- 16. Gibt es eine einfache Möglichkeit, Bilder schräg zu stellen?
- 17. Gibt es eine einfache Möglichkeit, das Alphabet programmatisch zu erhalten?
- 18. Gibt es eine einfache Möglichkeit, einen Code TextBox zu erstellen?
- 19. Gibt es eine einfache Möglichkeit, mit Basscss zu beginnen?
- 20. Gibt es eine einfache Möglichkeit, Hoptoad mit CakePHP zu verwenden?
- 21. Gibt es eine einfache Möglichkeit, den Flex Preloader zu verstecken?
- 22. Gibt es eine einfache Möglichkeit, alle gängigen Modulerweiterungen zu erhalten?
- 23. Gibt es eine einfache Möglichkeit, TypeScript-Definitionen zu installieren?
- 24. Gibt es eine einfache Möglichkeit, Openshift Autoscaling zu testen?
- 25. Gibt es eine einfache Möglichkeit, Gulture mit Django zu verwenden?
- 26. Gibt es eine einfache Möglichkeit, InternalsVisibleToAttribute zu verwenden?
- 27. Gibt es eine einfache Möglichkeit, zwei System.Drawing.Color-Werte zu mischen?
- 28. Gibt es eine einfache Möglichkeit, Benutzer von Facebook zu erhalten?
- 29. Gibt es eine einfache Möglichkeit, mit Open MPI zu klingeln?
- 30. Gibt es eine einfache Möglichkeit, ISO 8601 Dauer zu Timedelta zu konvertieren
wahrscheinlich nicht in jeden automatisierten Weg, da die Modelle der Express App und Meteor App so unterschiedlich sind. – imslavko
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. –