2016-11-10 4 views
0

Ich benutze den Google API Node-Client, um eine PDF-Datei von meinem Google-Laufwerk herunterladen, aber ich kann nicht herausfinden, wie Sie auf die Daten von der service.files.get Funktion zugreifen. Mein Code ist wie folgt:Pipe Daten zu string Google Node API

function download(auth, fileId) { 
    var service = google.drive('v3'); 
    var dest = fs.createWriteStream('something.pdf'); 

    service.files.get({ 
     auth: auth, 
     fileId: fileId, 
     alt: 'media' 
    }) 
    .on('data', function(chunk){ 
    console.log(chunk.toString()); // this gives me a JSON response of my bearer token, and not the pdf data 
    }) 
    .on('end', function() { 
     console.log('Done'); 
    }) 
    .on('error', function (err) { 
     console.log('Error during download', err); 
    }) 
    .pipe(dest); 
} 

ich diesen Download verwenden einen Anhang per E-Mail zu senden. Ich möchte die Datei nicht über die Variable dest auf meiner Festplatte speichern und würde stattdessen lieber eine base64-codierte Zeichenfolge aus der download-Funktion zurückgeben, aber ich kann nicht auf die eingehenden Daten von der API-Anfrage zugreifen. Kann mir jemand auf das richtige Ziel hinweisen, um darauf zuzugreifen?

Die Datei wird ordnungsgemäß heruntergeladen, wenn ich den Code so ausführe, wie er ist, aber ich kann nicht herausfinden, woher die .pdf-Daten gestreamt werden oder wie auf ihr "Daten" -Ereignis zugegriffen wird.

Antwort

2

Versuchen Sie, die Blöcke des Antworttextkörpers in eine Variable in Closure aufzulösen. Sie können auf die vollständige Akkumulation in einem 'Ende'-Ereignis-Callback zugreifen. Ich habe auch ein Beispiel für die Rückgabe der Zeichenfolge aus Ihrer asynchronen Funktion über einen Rückruf, der für Ihre Download-Funktion bereitgestellt wird, angegeben. Beachten Sie, dass Sie dies stattdessen mit Versprechen/async/etc. Tun könnten. Besonders relevant ist die Node.js-Stream-Dokumentation für "Stream Consumers" (https://nodejs.org/docs/latest-v5.x/api/stream.html#stream_api_for_stream_consumers).

function download(auth, fileId, doneCb) { 
    var respData = ''; 
    var service = google.drive('v3'); 

    service.files.get({ 
    auth: auth, 
    fileId: fileId, 
    alt: 'media' 
    }) 
    .on('data', function(chunk) { 
    respData += chunk; 
    }) 
    .on('end', function() { 
    // respData should contain all of the data now 
    doneCb(respData); 
    }) 
    .on('error', function (err) { 
    console.log('Error during download', err); 
    }); 
} 
+0

Wenn ich dies tun, ich bin nur noch ein JSON-Objekt enthält meine Authentifizierungs-Token bekommen, und ich bin nicht sicher, warum. Die Datei wird heruntergeladen, aber aus irgendeinem Grund kann ich nicht auf die Daten zugreifen. Könnte die Google API etwas seltsam machen und keinen Zugriff auf diese Informationen bieten? –

+0

Nachdem Sie sich die Schnellstart-Dokumentation zu Google Node.js-API-Clients angesehen haben, sieht es so aus, als ob Sie kein Streaming-Management benötigen. Sie sollten in der Lage sein, auf die Datei als zweites Argument zuzugreifen, das an den Rückruf übergeben wurde, der nach dem Abschluss ausgelöst wurde. service.files.get ({...}, function (err, resp)) {resp.resource ...}) Anforderungskörper angeben 'Der Hauptteil der Anforderung wird im Ressourcenparameterobjekt des Objekts angegeben anfordern.' (https://github.com/google/google-api-nodejs-client#usage) https://developers.google.com/drive/v3/web/quickstart/nodejs – Clark

+1

Clark Sie haben zwar recht, aber Die Daten werden nicht wie angegeben von resp.resource übergeben. Ich glaube, das ist nur für Anfragen. Siehe meine Antwort oben. Danke für die Hilfe! –

0

Nachdem auf GitHub durch die API-Probleme zu graben, entdeckte ich, wie die Download-Antwortdaten zu erhalten. Dies geschieht durch einen zweiten Parameter, der an die Funktion übergeben wird, die Ihnen die Antwortdaten liefert. Ich bin die Daten können wieder mit dem Versprechen gelangen oder einen Rückruf wie folgt:

service.files.get({ 
    auth: auth, 
    fileId: fileId, 
    alt: 'media' 
}, { 
    encoding: null // make sure that we get the binary data 
}, function (err, buffer) { 
    // I wrap this in a promise to handle the data 
    if (err) reject(err); 
    else resolve(buffer); 
});