节点 return 转 html 为 pdf 后的字节数组
Node return byte array after turning html to pdf
我正在使用 'html-pdf' npm 包在 nodeJs azure 函数中创建一个字节数组。我可以登录并看到正在创建字节数组,但是当我调用我的函数时,我无法将缓冲区获取到 return。我的回复是 200,如果我将其记录到字符串,我可以再次看到缓冲区。对于上下文,包采用 html 字符串和 returns pdf。如何设置对 return 字节数组的响应?
var pdf = require('html-pdf');
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
if ((req.body && req.body.data)) {
var html = req.body.data;
context.log(html);
console.log(html);
var data = []
pdf.create(html).toBuffer(function(err, buffer){
data.push(buffer);
context.res = {
setEncoding: 'binary',
// status: 200, /* Defaults to 200 */
body: Buffer.concat(data)
};
});
}
else {
context.res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
};
我可以重现这个问题,然后我做了一些研究并得到了一个可靠的 ,所以我将函数更改为普通函数(非异步)函数。
下面是我的测试代码:
var pdf = require('html-pdf');
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const html=req.body;
context.log(html);
var data = []
pdf.create(html).toBuffer(function(err, buffer){
data.push(buffer);
context.res = {
setEncoding: 'binary',
// status: 200, /* Defaults to 200 */
body: Buffer.concat(data)
};
context.done();
});
}
我用邮递员发送请求,它returns一个响应我选择Save to a file
,然后我打开文件就完成了。
如果以后有人需要解决这个问题,您必须从 pdf.create 创建一个新的承诺。我的代码现在看起来像这样。由于 GDI 支持 phantom js
,这显然在 azure 函数中不起作用
更新
如果部署到应用程序服务计划,这现在可以工作。不会在天蓝色的消费计划中工作。
var pdf = require('html-pdf');
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const html=req.body.data;
var data = await returnHtmlAsPdf(html);
var data2 = []
data2.push(data);
context.res = {
setEncoding: 'binary',
// status: 200, /* Defaults to 200 */
body: Buffer.concat(data2)
};
context.done();
};
async function returnHtmlAsPdf(html) {
return new Promise((resolve, reject) => {
pdf.create(html).toBuffer(function(err, buffer){
if(err){
reject(err);
}
resolve(buffer);
})
});
}
我正在使用 'html-pdf' npm 包在 nodeJs azure 函数中创建一个字节数组。我可以登录并看到正在创建字节数组,但是当我调用我的函数时,我无法将缓冲区获取到 return。我的回复是 200,如果我将其记录到字符串,我可以再次看到缓冲区。对于上下文,包采用 html 字符串和 returns pdf。如何设置对 return 字节数组的响应?
var pdf = require('html-pdf');
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
if ((req.body && req.body.data)) {
var html = req.body.data;
context.log(html);
console.log(html);
var data = []
pdf.create(html).toBuffer(function(err, buffer){
data.push(buffer);
context.res = {
setEncoding: 'binary',
// status: 200, /* Defaults to 200 */
body: Buffer.concat(data)
};
});
}
else {
context.res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
};
我可以重现这个问题,然后我做了一些研究并得到了一个可靠的
下面是我的测试代码:
var pdf = require('html-pdf');
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const html=req.body;
context.log(html);
var data = []
pdf.create(html).toBuffer(function(err, buffer){
data.push(buffer);
context.res = {
setEncoding: 'binary',
// status: 200, /* Defaults to 200 */
body: Buffer.concat(data)
};
context.done();
});
}
我用邮递员发送请求,它returns一个响应我选择Save to a file
,然后我打开文件就完成了。
如果以后有人需要解决这个问题,您必须从 pdf.create 创建一个新的承诺。我的代码现在看起来像这样。由于 GDI 支持 phantom js
,这显然在 azure 函数中不起作用更新 如果部署到应用程序服务计划,这现在可以工作。不会在天蓝色的消费计划中工作。
var pdf = require('html-pdf');
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const html=req.body.data;
var data = await returnHtmlAsPdf(html);
var data2 = []
data2.push(data);
context.res = {
setEncoding: 'binary',
// status: 200, /* Defaults to 200 */
body: Buffer.concat(data2)
};
context.done();
};
async function returnHtmlAsPdf(html) {
return new Promise((resolve, reject) => {
pdf.create(html).toBuffer(function(err, buffer){
if(err){
reject(err);
}
resolve(buffer);
})
});
}