html-pdf 包不适用于 aws lambda

问题描述

我曾尝试在部署在 AWS lambda代码中实现 html-pdf 包,但即使在我部署了 层 用于 lambda 上的 html-pdf 包。 下面是我的代码

import pdf from 'html-pdf';
import AWS from 'aws-sdk';

var S3 = new AWS.S3();
process.env.PATH = `${process.env.PATH}:/opt`;
process.env.FONTCONfig_PATH = "/opt";
process.env.LD_LIBRARY_PATH = "/opt";

export const convertToPDFandUpload = async (attachmentFile,empCertificate) => {
    let file;
    let params;
    var options = {
        height: "590px",width: "800px",phantomPath: '/opt/phantomjs_linux-x86_64'
    };

    return new Promise((resolve,reject) => {
        pdf.create(attachmentFile,options).toBuffer(function (err,res) {
            if (err)
                console.log(err);
            file = res;
            params = {
                Bucket: <my_bucket_name>,Key: `certificate/${empCertificate.candidateName}${empCertificate.certificateID}.pdf`,Body: file,ACL: 'public-read'
            };
            S3.upload(params,async function (err,data) {
                if (err) {
                    console.log(err,err.stack);
                    reject(null);
                } else {
                    resolve(data.Location);
                }
            });
        });
    });
};

在 toBuffer() 函数之后抛出错误

错误: { "errorType": "TypeError","errorMessage": "无法读取未定义的属性 'filename'",“堆”: [ “类型错误:无法读取未定义的属性文件名’”, “在 execPdfToBuffer (/var/task/apis/webpack:/home/nikhilsrivastva/Desktop/HR Onboarding/onboarding BE/hronboardingcodebase/services/certification/node_modules/html-pdf/lib/pdf.js:48:1)”, " 在 ChildProcess.respond (/var/task/apis/webpack:/home/nikhilsrivastva/Desktop/HR Onboarding/onboarding BE/hronboardingcodebase/services/certification/node_modules/html-pdf/lib/pdf.js:144:1) ”, " 在 ChildProcess.emit (events.js:314:20)"," 在 ChildProcess.EventEmitter.emit (domain.js:483:12)",“在 Process.ChildProcess._handle.onexit (internal/child_process.js:276:12)” ] }

解决方法

层 zip 文件必须包含一个名为“nodejs”的文件夹,并且该文件夹必须包含具有您的依赖项的“node_modules”文件夹。在此处查看确切结构:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path

适用于 Node.js 的 AWS X-Ray 开发工具包的示例文件结构

`xray-sdk.zip 
    └ nodejs/node_modules/aws-xray-sdk`

这样您就可以验证您的层 zip 文件是否具有正确的结构。