2016-05-03 3 views
1

Ich arbeite an einem Node.js-Projekt, das auf der Antwort von getObject von AWS beruht. Derzeit kann ich auf die Daten zugreifen, die ich brauche, und sie in einer Variablen speichern (header), aber ich weiß nicht, wie ich sie in der Hauptfunktion bereitstellen kann.Wie man eine Variable aus dem AWS getObject-Aufruf in Node.js zurückgibt

TileStreamerS3.prototype.Init = function(filepath, index, s3config){ 
    var retval = false; 
    AWS.config.update({accessKeyId: s3config.access_key, secretAccessKey: s3config.secret_key}); 
    var blc = new BlockLibraryConfigs(); 
    var awsConfig = blc.awsConfig; 
    AWS.config.update({region: awsConfig.region}); 

    var aws = new AWS.S3(); 
    var params = { 
     Bucket: s3config.bucket, 
     Key: s3config.tile_directory + filepath, 
     Range: 'bytes=0-27' 
    }; 



aws.getObject(params, function(err, data){ 
     if(err == null){ 
      var header = bufferpack.unpack('<7I', data.Body); 
      return header; 
     } 
    }); 
}; 

Wie gebe ich die header Variable zurück? Ich sah eine mögliche Lösung, die JQuery verwendet, aber ich bin auf Windows und habe Probleme, JQuery mit Node arbeiten zu lassen. Ich möchte diesen Weg nicht gehen müssen, wenn es einen besseren Weg dafür gibt.

UPDATE: Ich weiß, dass es mehrere Fragen bezüglich der Rückgabe von Werten aus asynchronen Funktionen gibt. Ich denke, was mich auslöst, ist, dass aws.getObject() eine Funktion ist, die eine andere Funktion als Parameter einnimmt. Ich möchte den header Wert von der Funktion zurückgeben, die ein Parameter für die aws.getObject() Funktion ist. Außerdem kann ich die getObject() Funktion nicht ändern.

+0

jQuery funktioniert nur auf dem Web-Browser/Front-End. NodeJS ist der Server/das Backend. Sie können nicht zusammen arbeiten. –

+0

@BlazeSahlzen dann warum gibt es ein npm Paket dafür? https://www.npmjs.com/package/jQuery –

+0

Es ist für Sie da, wenn Sie HTML-Daten auf der Serverseite manipulieren müssen. –

Antwort

1

Das erste, was über asynchrone Programmierung zu verstehen ist, dass Sie nicht tatsächlich das Ergebnis aus Ihrem Rückruf an Ihre Hauptfunktion oder anderswo zurückgeben können. Here's a tutorial on async coding to get you started.


Wie für Ihre aktuelle Situation, würde ich es Async Waterfall mit handhaben. Async zwingen die ansonsten asynchronen Funktionen dazu, sich synchron zu verhalten, indem sie darauf warten, dass sie beendet sind, bevor sie die nächste Funktion aufrufen (mit der Ausgabe der vorherigen Funktion als Argumente für die nächste Funktion). Hier

ein Beispiel:

TileStreamerS3.prototype.Init = function(filepath, index, s3config, callback) { 
// pass a callback function as a parameter 

    var retval = false; 
    AWS.config.update({ 
     accessKeyId: s3config.access_key, 
     secretAccessKey: s3config.secret_key 
    }); 
    var blc = new BlockLibraryConfigs(); 
    var awsConfig = blc.awsConfig; 
    AWS.config.update({ region: awsConfig.region }); 

    var aws = new AWS.S3(); 
    var params = { 
     Bucket: s3config.bucket, 
     Key: s3config.tile_directory + filepath, 
     Range: 'bytes=0-27' 
    }; 

    async.waterfall([function(callback) { 

     aws.getObject(params, function(err, data) { 
      if (!err) { 
       var header = bufferpack.unpack('<7I', data.Body); 

       callback(null, header); // using this we are passing the control to the 
       // next function in the array 
      } 
     }); 

    }, function(header, callback) { // this is the function which will be called 
     // synchronously from aws.getObject's callback 

     // use the header value passed from the previous function 
     // do the next bit of asynchronous computation 

     callback(null, output_if_any); // call the next function or the final callback 

    }], callback); // attach the callback function to the async.waterfall 

    // due to the async nature of the code, anything written after the waterfall will 
    // be executed before the above code! So if you try to set any variable within the 
    // async function's callback and console.log it here, you will get undefined. 

}; 

Was hier passiert, ist, dass async.waterfall verwenden wir eine Liste von Funktionen erstellen können (von denen jede asynchrone Funktionen enthalten kann) synchron ein-nach-dem-anderen genannt werden . Wenn alle Funktionen ausgeführt wurden, wird die letzte Funktion callback am Ende mit dem Ausgang results aufgerufen.

Wenn Sie nun die Funktion TileStreamerS3.Init nennen, tun Sie es wie folgt aus:

TileStreamerS3Object.Init(filepath, index, s3config, function(err, results) { 

    if (err) { 
     // handle the error 
    } else { 
     // do whatever you want with the results 
     // and continue the processing 
    } 

}); 
+0

Am Ende von 'TileStreamerS3.prototype.Init' muss ich einen Wert basierend auf diesen Ergebnissen zurückgeben. Wie würde ich 'TileStreamerS3.prototype.Init' returns Wert setzen? –

+1

Ich habe das Beispiel aktualisiert, das zeigt, wie Sie Ihr Ergebnis von der Funktion zurückgeben können. –

+0

Es tut mir leid, dass ich einen Fehler gemacht habe.Wie gesagt, Sie können das Ergebnis der Funktion nicht zurückgeben, Sie müssen den Rest Ihres Codes in der Callback-Funktion ausführen. Ich habe das Beispiel aktualisiert. –

Verwandte Themen