2016-07-12 14 views
1

Ich habe einen sails.js-Dienst, der Restore (Rest-Client) verwendet, um API-Aufrufe an externe API und holen Daten zu machen.Konsolidieren Sie mehrere Rückrufe in node.js Modul exportiert

Das Modul sieht wie folgt aus:

var rest = require('restler'); 

module.exports = { 
    config: { 
     url: sails.config.remote_api.base_url.concat('/countries'), 
     rejectUnauthorized: sails.config.remote_api.validateSsl, 
     options: { 'Content-Type': 'application/json' } 
    }, 
    find: function(headers, payload, callback) { 
     var request = rest.get(this.config.url, this.config.options); 
     sails.log.info('Outgoing Request', { log_id: headers[x - request - id], method: request.method, host: request.host, url: request.url }); 

     request.on('2XX', function(data, response) { 
      callback(data, response); 
     }); 
    } 
} 

In dem obigen Code request.on ('2XX', ...) behandelt das emittierte Ereignis, wenn Antwortcode in der 200-Serie.

Wenn wir weitere Handler für Ereignisse hinzufügen, die ausgegeben werden, wenn der Antwortcode 300, 400, 500 ist, wird eine Duplikation der gleichen Callback-Funktion für jeden der Blöcke erzeugt. Für z.B.

var rest = require('restler'); 
module.exports = { 
    config: { 
     url: sails.config.remote_api.base_url.concat('/countries'), 
     rejectUnauthorized: sails.config.remote_api.validateSsl, 
     options: { 'Content-Type': 'application/json' } 
    }, 
    find: function(headers, payload, callback) { 
     var request = rest.get(this.config.url, this.config.options); 
     sails.log.info('Outgoing Request', { log_id: headers[x - request - id], method: request.method, host: request.host, url: request.url }); 

     request.on('2XX', function(data, response) { 
      callback(data, response); 
     }); 

     request.on('3XX', function(data, response) { 
      callback(data, response); 
     }); 

     request.on('4XX', function(data, response) { 
      callback(data, response); 
     }); 

     request.on('5XX', function(data, response) { 
      data = {}; 
      data.succeeded = false; 
      data.failureCode = 'SYSTEM ERROR'; 
      data.failureReason = 'A system error has occurred. Please try again. If the problem persists contact support'; 
      callback(data, response); 
     }); 

     request.on('error', function(data, response) { 
      data.succeeded = false; 
      data.failureCode = 'SERVICE UNAVAILABLE'; 
      data.failureReason = 'The service is temporarily unavailable. Please try again later.'; 
      callback(data, response); 
     }); 
    } 
} 

Wie vermeiden wir die Vervielfältigung der folgenden Zeilen?

function(data, response) { 
    callback(data, response); 
} 

Antwort

1

Nein, Sie sollten wirklich nicht. Sie haben im Grunde verschiedene Ereignisse wie 2XX, 3XX usw. behandelt. Jedes Ereignis wird separat behandelt, und das ist eine gute Übung. Eine weitere Vereinfachung könnte das ordentliche Design beschädigen.

Obwohl Sie direkt callback statt

function(data, response) { 
    callback(data, response); 
} 

ähnliche

request.on('2XX', callback); 
+0

Dank sehr verwenden können. Das vereinfacht den Code sehr. –

+0

Ich habe Upvote gemacht, aber mein Ruf ist niedrig, mein Upvote wurde nicht angezeigt. –

+0

Auf eine separate Anmerkung: Wenn ein Modul.exports mehrere Funktionen hat, die sich wiederholende Codeblöcke haben, wie nach DRY-Prinzip, wie man 1. einen solchen wiederholenden Code in eine Unterfunktion trennt 2. wie man eine Unterfunktion innerhalb von module.exports aufruft –