使用 html-pdf 创建 pdf 时出错

aks*_*adi 5 ejs node.js phantomjs html-pdf

尝试在节点 js 中使用 html-pdf 生成 pdf,但在某些记录后出现以下错误:

TypeError: Cannot read property 'on' of undefined`

events.js:183
      throw er; // Unhandled 'error' event
      ^
Error: spawn /usr/local/lib/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs EAGAIN
Run Code Online (Sandbox Code Playgroud)

代码:

    const filePathName = path.join(__dirname, '../../../views/', "invoice.ejs");
    const htmlString = fs.readFileSync(filePathName).toString();
    let options = { format: 'Letter',"timeout": 600000 };
    const ejsData = ejs.render(htmlString, data);

    return pdf.create(ejsData, options).toFile(path.join(__dirname, '../../../tmp/', data.filename), (err, response) => {
      if (err) return console.log('err',err);
      return response;
    });
Run Code Online (Sandbox Code Playgroud)

Ruk*_*han 0

线上const ejsData = ejs.render(htmlString, data);ejs.render()异步的。因此,您必须将函数转换为异步函数并添加等待,如下所示,

const yourFunction = async () => {
    const filePathName = path.join(__dirname, '../../../views/', "invoice.ejs");
    const htmlString = fs.readFileSync(filePathName).toString();
    let options = { format: 'Letter',"timeout": 600000 };
    const ejsData = await ejs.render(htmlString, data); //adding await

    return pdf.create(ejsData, options).toFile(path.join(__dirname, '../../../tmp/', data.filename), (err, response) => {
      if (err) return console.log('err',err);
      return response;
    });
}
Run Code Online (Sandbox Code Playgroud)

或者,做这样的事情:

    const filePathName = path.join(__dirname, '../../../views/', "invoice.ejs");
    const htmlString = fs.readFileSync(filePathName).toString();
    let options = { format: 'Letter',"timeout": 600000 };
    ejs.renderFile(htmlString, data, (err, ejsData) => {
    if (err) {
          res.send(err);
    } else {
        pdf.create(ejsData, options).toFile((path.join(__dirname, '../../../tmp/', data.filename), (err, response) => {
                if (err) return console.log('err',err);
                return response;
            }););
        });
    }
Run Code Online (Sandbox Code Playgroud)