Javascript 使用angular 2下载节点流
我正在尝试使用node js在服务器端生成一个PDF,并在angular 4的客户端下载它(就像Google Drive在按download as PDF时所做的那样) 节点JS代码如下所示:Javascript 使用angular 2下载节点流,javascript,node.js,angular,pdf,Javascript,Node.js,Angular,Pdf,我正在尝试使用node js在服务器端生成一个PDF,并在angular 4的客户端下载它(就像Google Drive在按download as PDF时所做的那样) 节点JS代码如下所示: var pdf = require('html-pdf'); app.get('/pdf/contacts', function(req, res) { Contact.find(function(error, response) { res.render('pdfs/views
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);
});
});
});
});
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");
});
}
在角度4的一侧,我得到了如下结果:
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);
});
});
});
});
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");
});
}
然后我得到了这个错误:error:请求主体既不是blob也不是数组缓冲区
我不知道我做错了什么,顺便问一下,有没有办法不用任何像文件保护程序这样的插件就可以轻松下载这个流?因为如果我在浏览器上输入api链接,它会自动下载pdf文件
提前谢谢你,丹尼尔。我假设角度部分正在客户端浏览器上运行。 为什么不使用
fetch
API向节点请求文件
const response = await fetch("http://localhost:3000/pdf/contacts");
const blob = await response.blob();
要使用此功能,您需要使用异步等待
,因为从站点请求数据(即使来自本地服务器)是一项异步任务,您的代码将保持运行,而不等待请求完成