2017-10-06 4 views
0

J'essaie de générer un fichier PDF côté serveur en utilisant le nœud js et de le télécharger du côté client sur l'angle 4 (quelque chose comme Google Drive lorsque vous appuyez sur télécharger en PDF).télécharger le flux de nœud avec angulaire 2

Le code Node JS ressemble à ceci:

var pdf = require('html-pdf'); 

app.get('/pdf/contacts', function(req, res) { 
    Contact.find(function(error, response) { 
     res.render('pdfs/views/contacts', {name: 'Daniel Pacuraru', contacts: response}, function(error, thtml) { 

      var opts = { 
       "format": "A4", 
       "orientation": "portrait", 
       "border": "0.4in" 
      }; 

      pdf.create(thtml, opts).toStream(function(err, stream){ 
       res.attachment('pdfname.pdf'); 
       stream.pipe(res); 
      }); 

     }); 
    }); 
}); 

Du côté 4 angulaire je suis quelque chose comme ceci:

import * as FileSaver from 'file-saver'; 

downloadContacts(): Promise<any> { 
    return this.http 
     .get('http://localhost:3000/pdf/contacts') 
     .toPromise() 
     .then(response => { 

      FileSaver.saveAs(response, "testdata.pdf"); 

     }); 
} 

Je reçois cette erreur: Failed to execute 'createObjectURL' on 'URL' et si je change la ligne dans ce

FileSaver.saveAs(response.blob(), "testdata.pdf"); 

puis-je obtenir cette erreur: Error: The request body isn't either a blob or an array buffer

Je n'arrive pas à comprendre ce que je fais mal, btw y at-il un moyen de télécharger ce flux facile sans aucun plugin comme l'économiseur de fichiers? puisque si je viens d'entrer et le lien api sur le navigateur, il me télécharge automatiquement ce fichier pdf.

Merci d'avance, Daniel.

Répondre

0

Je suppose que la partie angulaire est exécutée sur le navigateur des clients. Pourquoi ne pas utiliser l'API fetch pour demander le fichier au noeud?

const response = await fetch("http://localhost:3000/pdf/contacts"); 
const blob = await response.blob(); 

Pour utiliser cela, vous devez utiliser le async awaitsyntax, puisque la demande de données à partir d'un site, même si elle est d'un serveur local, est une tâche asynchrone et votre code continuer à courir, sans attendre la demande pour finir.