在制作POST请求时返回空白PDF,但使用GET工作正常

我有一个AngularJs前端和一个NodeJS后端。 我正在尝试基于来自AngularJS的一些参数在NodeJS上构buildPDF,并返回PDF作为响应。

我使用的代码似乎工作正常,当我从AngularJS发出GET请求时,但是当我发出一个POST请求时它返回一个空白的PDF。 我需要发送POST请求,因为我必须发送一些特定的数据。

我将文件保存在磁盘上,然后发送到前端,所以我可以看到PDF正在正确生成。 它要么没有被正确发送,要么在FrontEnd上正确读取。

以下是我的AngularJS代码

var url = {{My Node Server URL}}; (Note: Works when I make a Get request, without sending post params) var $promise = $http.post(encodeURI(url), { responseType: 'arraybuffer', competitors: competitors, channels: channels }); $promise.then( function success(response) { var blob = new Blob([response.data], { type : 'application/pdf' }); var pdfLink = (window.URL || window.webkitURL).createObjectURL( blob ); window.open( pdfLink, '_blank' // <- This is what makes it open in a new window. ); cb(pdfLink); }, function error(response) { --Error Handling-- } ) 

以下是我的NodeJS代码

 wkhtmltopdf( html, { output: pdfName }, function (code, signal) { fs.readFile(pdfName, function (err, data) { if (err) {res.writeHead(400); res.end("" + err); return;} res.writeHead( 200, { "content-type" : "application/pdf", "Content-Disposition": "attachment; filename=Best.pdf " } ); res.end(data); }); } ); 

我已经看了很多地方,并尝试几乎所有东西,但似乎没有任何工作。 任何提示/帮助/build议,将不胜感激。 请问是否需要提供更多的信息或细节。 TIA

得到它了! 我只需要添加responseType作为arraybuffer作为另一个参数。 我认为这是自我解释为什么这个工作。 所以下面的代码工作!

 var $promise = $http.post(encodeURI(url), { competitors: competitors, channels: channels },{responseType: 'arraybuffer'}); 

对于使用Angular 2+的这个场景的任何人来说,解决scheme是相同的,但执行方式不同。 请参阅: https : //angular.io/docs/ts/latest/api/http/index/ResponseContentType-enum.html

在我的应用程序中,我将一个文档名称传递给了我的express服务器,该服务器使用res.download(filename)传回res.download(filename)

前端服务如下所示:

 downloadDoc(docName: string) { let pkg = {docName: docName}; let opts = new RequestOptions({ responseType: ResponseContentType.ArrayBuffer }); return this.http .post(this.baseUrl + '/downloadDoc', pkg, opts) .toPromise() .then((res: any) => { let blob = new Blob([res._body], {type: 'application/pdf'}); return blob; }); }