1

我开发了一个功能,它采用单页 HTML,使用 htmp-pdf 包将其转换为 PDF 并上传到 firebase 存储。当我从我的电脑运行这个函数时,它需要不到 5 秒,但是当我从 firebase 函数运行它时,它最多需要 6 分钟。这是代码:

  pdf.create(estadoCuenta, { orientation: 'portrait', type: 'pdf', timeout: '360000' }).toStream(function(err, stream) {
      console.log('Nombre del archivo generado: ' + file.name);
      stream.pipe(file.createWriteStream({
      metadata: {
      contentType: 'application/pdf',
      metadata: {
          origin: 'created by ...'
          }
      },
      public: true,
      validation: "md5"
      }))
      .on('error', function(err) {
          console.log('error en la carga de archivo: ' + err);
      })
      .on('finish', function() {
              // The file upload is complete.
              let estadoCuentaPDF = file.name.replace('/','%2F');
              console.log('estadoCuentaPDF:' + estadoCuentaPDF);
      });
    });

变量“estadoCuenta”包含要转换的 html。

这是我的 package.json:

{
  "name": "dialogflowFirebaseFulfillment",
  "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
  "version": "0.0.1",
  "author": "xxx",
  "repository": "https://yyy@bitbucket.org/zzz/www.git",
  "license": "xxx",
  "private": true,
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "engines": {
    "node": "10"
  },
  "dependencies": {
    "-": "0.0.1",
    "@google-cloud/firestore": "^3.7.5",
    "actions-on-google": "^2.10.0",
    "cors": "^2.8.5",
    "dialogflow": "^1.2.0",
    "dialogflow-fulfillment": "^0.6.1",
    "dotenv": "^8.2.0",
    "envfile": "^6.9.0",
    "express": "^4.17.1",
    "firebase-admin": "^8.0.0",
    "firebase-functions": "^3.6.1",
    "firebase-tools": "^7.4.0",
    "html-pdf": "^2.2.0",
    "isomorphic-fetch": "^2.2.1",
    "node-env-file": "^0.1.8",
    "nodejs-base64": "^1.0.3",
    "nodemailer": "^6.3.0",
    "pg": "^7.18.2",
    "string-similarity": "^3.0.0",
    "twilio": "^3.31.1",
    "unirest": "^0.6.0"
  }
}
4

2 回答 2

1

这是因为分配给函数的计算资源无法与您的本地设备相媲美。

云功能的 CPU 速度与本文档中提到的分配的内存成正比,请尝试为您的功能设置 2GB 内存。

处理资源越多,您的功能就会越快。

如果函数在您可接受的时间内没有响应,下一步是使用另一个无服务器产品,例如App EngineCloud Run,它允许您为应用程序设置更多资源。

这些更改将影响您的账单。

于 2020-09-01T17:10:20.717 回答
0

I tweaked your example and it works for me with a very small HTML file and a 256MB memory allocation. I retained your packages to try to repro your usage. I used an inline and very small HTML document, I used Node.JS 12 and I replaced e.g. file with fs. I'm not much of a Node.JS developer so apologies for the poor code.

/* jshint esversion: 6 */
/* globals exports,require */

const pdf = require("html-pdf");
const fs = require("fs");

const estadoCuenta = `<html><head><title>Stackoverflow: 63688028</title></head><body><div id="content">Hello Freddie!</div></body></html>`;

const convertor = (req, res) => {

    // Write it
    const options = { orientation: 'portrait', type: 'pdf', timeout: '360000' };
    pdf.create(estadoCuenta, options).toStream(function (err, stream) {
        var writeStream = fs.createWriteStream("/tmp/file.pdf");
        stream.pipe(writeStream).on('error', function (err) {
            console.log(`[stream.pipe] Error: ${err}`);
        }).on('finish', function () {
            // Read it
            var readStream = fs.createReadStream('/tmp/file.pdf');
            var filename = encodeURIComponent("converted.pdf");

            res.setHeader('Content-disposition', `inline; filename="${filename}"`);
            res.setHeader('Content-type', 'application/pdf');

            readStream.pipe(res);
            console.log(`Done`);
        });
    });

};

exports.convertor = convertor;

For local debugging, I appended the following:

const express = require("express");
const app = express();
const port = 3000;

app.get("/", convertor);

app.listen(port, () => {
    console.log(`Listening: http://localhost:${port}`);
});

There are many dependencies in the package.json and I assume you need them all. You don't need to import express when you're deploying to Cloud Functions.

NOTE html-pdf includes a severe vuln:

=== npm audit security report ===                        
                                                                                
                                                                                
                                 Manual Review                                  
             Some vulnerabilities require your attention to resolve             
                                                                                
          Visit https://go.npm.me/audit-guide for additional guidance           
                                                                                
                                                                                
  Critical        Arbitrary File Read                                           
                                                                                
  Package         html-pdf                                                      
                                                                                
  Patched in      No patch available                                            
                                                                                
  Dependency of   html-pdf                                                      
                                                                                
  Path            html-pdf                                                      
                                                                                
  More info       https://npmjs.com/advisories/1095                             
                                                                                
found 1 critical severity vulnerability in 750 scanned packages
  1 vulnerability requires manual review. See the full report for details.
于 2020-09-03T18:31:54.053 回答