0

Je suis en train de migrer mon projet NodeJS vers API Gateway et je n'arrive pas à comprendre comment télécharger un fichier à partir de Lambda.API Gateway Response Télécharger le fichier à l'aide de Node, PDFMake, Serverless

Voici un extrait du code de réponse sur mon projet de nœud local.

app.get('/downloadPDF', function (req, res) { 
    res.setHeader('Content-disposition', 'attachment; filename=test.pdf'); 
    res.setHeader('Content-type', 'application/pdf'); 
    var PdfPrinter = require('pdfmake'); 
    var printer = new PdfPrinter(fonts); 

    var pdfDoc = printer.createPdfKitDocument(dd); 
    pdfDoc.pipe(res); 
    pdfDoc.end(); 
}); 

Piping à la réponse, j'ai été en mesure de récupérer un fichier PDF.

Voici un extrait de ma fonction lambda utilisant serverless.

module.exports.createPDF = (event, context) => { 
    var PdfPrinter = require('pdfmake'); 
    var printer = new PdfPrinter(fonts); 

    var pdfDoc = printer.createPdfKitDocument(dd); 
    pdfDoc.pipe(res); 
    pdfDoc.end(); 
} 

Voici le point final dans mon serverless.yml

createPDF: 
handler: functions.myFunction 
events: 
    - http: 
     path: services/getPDF 
     method: get 
     response: 
     headers: 
      Content-Type: "'application/pdf'" 
      Content-disposition: "'attachment; filename=test.pdf'" 

Je ne sais pas comment obtenir référence à l'objet de réponse dans Lambda à la conduite à. Est-ce possible? Y a-t-il un autre moyen?


Mise à jour

J'ai fini par résoudre ce problème en renvoyant les base64 binaires PDF codées dans une réponse JSON et le décodage sur le client. Remarque: l'utilisation du décodage base64 dans le modèle de mappage de réponse ne fonctionnait pas.

Exemple de code:

var buffers = []; 
pdfDoc.on('data', buffers.push.bind(buffers)); 

pdfDoc.on('end', function() { 
    var bufCat = Buffer.concat(buffers); 

    var pdfBase64 = bufCat.toString('base64'); 

return cb(null, 
    {"statusCode": 200, 
    "headers": {"Content-Type": "application/json"}, 
    "body": pdfBase64}); 
}); 

Répondre

1

passerelle API ne supporte pas nativement les données binaires. Certains de nos clients ont eu un succès en codage base64 des données dans Lambda, y compris dans une réponse JSON et en utilisant un modèle de cartographie de réponse pour décoder les données afin de répondre au client.

+0

Merci pour la suggestion! Malheureusement, je n'ai pas réussi à suivre cette route, mais cela m'a donné de l'expérience avec les modèles de cartographie de réponse. – Padawan

1

API Gateway ne prend pas en charge l'envoi de réponses binaires. Comme alternative, vous pouvez avoir vos données binaires de magasin Lambda dans S3 et renvoyer HTTP rediriger vers l'emplacement de l'objet S3 via l'en-tête Location.

+0

Grande suggestion et je crois que cela fonctionnerait, mais le stockage ne correspond pas aux exigences pour le moment. J'espère que cela aide les autres! – Padawan