带有 Node、Express 和 Puppeteer 的 Polymer 入门套件

Polymer Starter Kit with Node, Express, and Puppeteer

好的,我是这一切的新手,所以非常感谢任何帮助。

我已经设法使用 Node 和 Express 从我在主目录 (server.js) 中创建的文件的 Polymer build 目录提供 Polymer Starter Kit (PSK) 网站:

// Node.js notation for importing packages
var express = require('express');

// Spin up a server
var app = express();

// Serve static files from the main build directory
app.use(express.static(__dirname + '/build/es5-bundled'));

// Render index.html on the main page, specify the root
app.get('/', function(req, res){
  res.sendFile("index.html", {root: '.'});
});

// Tell the app to listen for requests on port 3000
app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

我从终端输入 'node server.js',该网站在 localhost 3000 上可用,一切正常。

我想做的是使用节点模块 Puppeteer,在网站访问者单击按钮时从示例网页生成 PDF 文件。这是我放入 PSK 的 my-app.html 文件的 MyApp class 的代码,单击按钮时将调用它。

functionPDFCreate() {

  const puppeteer = require('puppeteer');

  (async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://news.ycombinator.com', { waitUntil: 'networkidle2' });
    await page.pdf({ path: 'hn.pdf', format: 'A4' });

    await browser.close();
  })();

}

但是returns'require is not defined'上面的函数。我做错了吗?我是否需要以某种方式将 functionPDFCreate 代码放入 server.js 并使用 Express 路由?当 PSK 网站访问者单击按钮时,我究竟如何执行 functionPDFCreate 中的代码?感谢您提供的任何帮助。

您是在浏览器上下文中调用 functionPDFCreate 吗?正如@YouneL 建议的那样,即使使用 browserify 或 webpack 也无法正常工作。

您应该在提供 PDF 的 Express 应用程序中公开端点:

app.get('/hn', function(req, res) {
    functionPDFCreate().then(() => {
        // now file is written on the disk
        res.sendFile('hn.pdf', { root: '.' });
    });
});

functionPDFCreate 应该是这样的:

const puppeteer = require('puppeteer');

async function functionPDFCreate() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://news.ycombinator.com', { waitUntil: 'networkidle2' });
    await page.pdf({ path: 'hn.pdf', format: 'A4' });

    await browser.close();
}

在您的浏览器应用中,您应该有这样的下载按钮(框架无关示例):

<a href="http://localhost:3000/hn" download="hn.pdf">Download HN PDF</a>