2

我正在构建一个使用 html-pdf 包(使用 PhantomJS)的 firebase 函数。该功能在我的本地机器上运行良好,但每当我在 Firebase 上部署该功能时,都会收到以下错误:

错误:html-pdf:PDF 生成超时。Phantom.js 脚本没有退出。

我已经更改了 timeout 参数pdf.create()并继续获得相同的结果。关于仅在将其部署到 Firebase 时可能会造成此问题的任何想法?代码如下。

const pdf = require('html-pdf');
const runtimeOpts = {
    timeoutSeconds: 540,  // in seconds
    memory: '2GB'
  }

exports.sendToKindle = functions.runWith(runtimeOpts).https.onRequest(async (req, res) => {
   // REMOVED A BLOCK OF CODE FOR SIMPLICITY, BUT CAN PUT BACK IN IF NEEDED//
   var options = { 
       format: 'Letter',
       directory: "/tmp", 
       timeout: 540000,  // in milliseconds
   };
    
   const blookFileName = createFileName(blookData.title) + '.pdf';
    
   const tempFilePath = path.join(os.tmpdir(), `${blookFileName}`);

   const htmlFilePath = path.join(os.tmpdir(), 'book.html');

   const htmlFs = fs.openSync(htmlFilePath, 'w');

   await fs.promises.appendFile(htmlFilePath, bookHTML);

   const fd = fs.openSync(tempFilePath, 'w');

   var html = fs.readFileSync(htmlFilePath, 'utf8');

   let mailgunObject = null;

   pdf.create(html, options).toFile(tempFilePath, async (err, res) => {
           if (err) return console.error(err);
           mailgunObject = await sendEmail(tempFilePath, kindleEmail);
           return console.log(res);
       });

   fs.closeSync(fd);
   fs.closeSync(htmlFs);

   return cors(req, res, () => {
        res.status(200).type('application/json').send({'response': 'Success'})
    })
4

2 回答 2

3

我可以通过将 pdf.create().toFile() 放置在云函数的返回中来修改代码来解决这个问题。

const pdf = require('html-pdf');
const runtimeOpts = {
    timeoutSeconds: 300,  // in seconds
    memory: '1GB'
  }

exports.sendToKindle = functions.runWith(runtimeOpts).https.onRequest(async (req, res) => {
   // REMOVED A BLOCK OF CODE FOR SIMPLICITY, BUT CAN PUT BACK IN IF NEEDED//
   var options = { 
       format: 'Letter',
       directory: "/tmp", 
       timeout: 540000,  // in milliseconds
   };
    
   const blookFileName = createFileName(blookData.title) + '.pdf';
    
   const tempFilePath = path.join(os.tmpdir(), `${blookFileName}`);

   const htmlFilePath = path.join(os.tmpdir(), 'book.html');

   const htmlFs = fs.openSync(htmlFilePath, 'w');

   await fs.promises.appendFile(htmlFilePath, bookHTML);

   const fd = fs.openSync(tempFilePath, 'w');

   var html = fs.readFileSync(htmlFilePath, 'utf8');

   return cors(req, res, () => {
        pdf.create(html, options).toFile(tempFilePath, async (err, res) => {
           if (err) return console.error(err);
           let mailgunObject = await sendEmail(tempFilePath, kindleEmail);
           fs.closeSync(fd);
           fs.closeSync(htmlFs);
           return console.log(res);
        });

        res.status(200).type('application/json').send({'response': 'Success'})
    })
于 2020-10-25T20:35:01.343 回答
0

我遇到了同样的问题。实际上我意识到,当我通过 Postman 使用 html-pdf 调用该函数时,或者只是通过 Google Chrome 的请求调用该函数时,pdf 过去在 2 或 3 秒内生成,而直接从我的应用程序。所以这就是我所做的:将 html-pdf 放在我部署的单独函数中,然后调用它:

https = require('https'); 
https.get(https://us-central1-your-project-name.cloudfunctions.net/your-function-using-html-pdf)
于 2021-04-29T14:42:31.843 回答