Die allgemeine Vorgehensweise beim Refactoring besteht darin, zu identifizieren, was in Ihrem Code anders ist, und diesen als dynamischen Teil zu extrahieren, der an eine Funktion übergeben wird, die den gemeinsamen Code enthält.
Zum Beispiel sind die zwei Dinge, die hier verschieden sind, der Weg, auf dem die Anfragen passieren
'/companies' vs '/companies/:id'
und die damit verbundene Weg, der zu http.get
'/companies' vs '/companies/' + req.params.id
Sie diese übergeben wird extrahieren und Übergeben Sie sie an eine Funktion, die Ihnen einen Handler zuweisen wird.
Hier ist ein allgemeiner Ansatz:
// props contains the route and
// a function that extracts the path from the request
function setupGet(router, props) {
router.get('/' + props.route, function(req, res, next) {
http.get({
host: 'http://api.com',
path: props.getPath(req)
}, function(response) {
var body = '';
response.on('data', function(d) {
body += d;
});
});
res.render('company', {
data: body
});
});
}
Und es dann mit den beiden Optionen nennen:
setupGet(router, {
route: 'companies',
getPath: function(req) {
return 'companies';
}
});
setupGet(router, {
route: 'companies/:id',
getPath: function(req) {
return 'companies' + req.params.id;
}
});
Der Vorteil hierbei ist, dass Sie eine beliebige Kombination von Routen und Wege, wie die Verwendung als gut nutzen können andere req
Eigenschaften, um den Pfad zu bestimmen.
Eine andere Sache, die Sie erkennen müssen, ist, dass Ihr res.render
Anruf passieren wird, bevor Sie body += d
tun, weil der ehemalige synchron direkt nach dem Aufruf http.get
geschieht und diese geschieht asynchron (etwas später).
Wahrscheinlich möchten Sie die Methode render
in den Callback selbst setzen.
// props contains the route and
// a function that extracts the path from the request
function setupGet(router, props) {
router.get('/' + props.route, function(req, res, next) {
http.get({
host: 'http://api.com',
path: props.getPath(req)
}, function(response) {
var body = '';
response.on('data', function(d) {
body += d;
// probably want to render here
res.render('company', {
data: body
});
});
});
});
}
guten Punkt. Ich gewöhne mich immer noch an dieses asynchrone Zeug Ich werde nicht in der Lage sein, ein Modell zu erstellen, so dass ich/companies in mehr als einer Seite anrufen kann? Ich frage, weil der Async die Anfrage-Antwort vervollständigen muss, um Daten zu erhalten. Jedes Mal, wenn ich alle Firmen anzeigen muss, muss ich eine HTTP-Anfrage machen und die Daten im Callback senden? – handsome
Nun, wenn die Unternehmen nicht ändern, können Sie sie irgendwo im Speicher speichern und die Anfrage erst machen, die Firmen speichern, und dann jedes Mal danach den gespeicherten Wert zurückgeben. Soll ich meine Frage bearbeiten und Ihnen ein Beispiel zeigen? – nem035
das macht Sinn, aber ich bin auf der Suche nach etwas mehr modellorientiert, wie die gute alte PHP, so dass ich Logik wiederverwenden kann, anstatt all diese http Anrufe überall. Danke, Mann! – handsome