使用Puppeteer addStyleTag注入CSS生成PDF时GCF报意外令牌错误
问题:GCP Cloud Function部署时注入CSS生成PDF报错
我用Handlebars的index.hbs和alert.css文件,通过以下代码注入CSS生成PDF,本地测试正常,但部署到GCP Cloud Function时出现语法错误。
生成PDF的代码
await page.setContent(await compile('alert', deeta)); await page.addStyleTag({path: './templates/alert.css'}) const pdf = await page.pdf({ format: 'A4', printBackground: true });
有效CSS内容
body { width: 97.7%; box-sizing: border-box; } h1 { margin: 0; } .header { display: flex; flex-direction: row; justify-content: space-between; align-items: center; height: 70px; width: 100%; background-color: black; padding: 10px; }
生成的HTML结构
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My Title</title> </head> <body> <div class="header"> <h1 class="title">RAPID Alert</h1> <img src="./logo.jpg" alt="logo here"/> </div> <div class="content"> <img class="dependent-img" src="{{dependentImage}}" /> <div class="dependent-data"> <div class="dependent-name"> <h1>Name: </h1> <h1 class="name">Jon Doe Smith</h1> </div> </div> </div> </body> </html>
报错信息
Detailed stack trace: /workspace/templates/alert.css:1 body { ^ Unexpected token '{'
解决方法
1. 读取CSS内容后用content参数注入
云环境中路径解析可能出问题,直接读取CSS文件内容,避免路径依赖:
const fs = require('fs').promises; const path = require('path'); // ... await page.setContent(await compile('alert', deeta)); // 读取CSS文件内容 const cssPath = path.join(__dirname, './templates/alert.css'); const cssContent = await fs.readFile(cssPath, 'utf8'); // 用content参数注入样式 await page.addStyleTag({content: cssContent}); const pdf = await page.pdf({ format: 'A4', printBackground: true });
2. 确保使用绝对路径
GCP Cloud Function的根目录是/workspace,用__dirname拼接绝对路径,避免相对路径解析错误:
const path = require('path'); // ... await page.addStyleTag({ path: path.resolve(__dirname, './templates/alert.css') });
3. 直接将CSS嵌入Handlebars模板
把CSS内容直接写到index.hbs的<head>标签里,彻底规避文件读取和路径问题:
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My Title</title> <style> body { width: 97.7%; box-sizing: border-box; } h1 { margin: 0; } .header { display: flex; flex-direction: row; justify-content: space-between; align-items: center; height: 70px; width: 100%; background-color: black; padding: 10px; } </style> </head>
内容的提问来源于stack exchange,提问作者Pis7ftw
相关产品推荐
相关产品推荐

