Javascript 使用Puppeter生成PDF后渲染页面?

Javascript 使用Puppeter生成PDF后渲染页面?,javascript,pdf,pdf-generation,puppeteer,Javascript,Pdf,Pdf Generation,Puppeteer,我目前正在尝试使用Puppeter生成一个PDF,然后向用户呈现一个带有“谢谢”消息的页面。一旦用户点击该页面,傀儡PDF有望开始在用户的机器上下载。但是我遇到了一些麻烦 从表单中收集一些基本信息后,我可以成功地将用户重定向到我希望他们访问的页面: app.post("/generatepdf", function (req, res) { UserPdfRequest.create({ email: req.body.email, companyName: req.body.compan

我目前正在尝试使用Puppeter生成一个PDF,然后向用户呈现一个带有“谢谢”消息的页面。一旦用户点击该页面,傀儡PDF有望开始在用户的机器上下载。但是我遇到了一些麻烦

从表单中收集一些基本信息后,我可以成功地将用户重定向到我希望他们访问的页面:

app.post("/generatepdf", function (req, res) {

  UserPdfRequest.create({ email: req.body.email, companyName: req.body.companyName }, function (err, createdRequest) {
    if (err) {
      console.log(err);
    } else {
      console.log(createdRequest);
      res.redirect("/" + createdRequest._id + "/pdf-download");
    }
  })

});
然后,我将它们发送到我的route,route负责查找相关用户,生成PDF,然后呈现感谢页面:

app.get("/:companyId/pdf-download", function (req, res) {

  UserPdfRequest.findById(req.params.companyId, function (err, foundRequest) {
    if (err) {
      console.log(err);
    } else {
      console.log(foundRequest);

      (async () => {
        const browser = await puppeteer.launch()
        const page = await browser.newPage()
        const url = 'http://localhost:3000/' + req.params.companyId + '/pdf-download';
        await page.goto(url, {waitUntil: 'networkidle0'});
        const buffer = await page.pdf({ format: "A4", printBackground: true });
        res.type('application/pdf')
        res.send(buffer)
        browser.close()
      })()

      res.render("pdfDownload", { email: foundRequest.email, companyName: foundRequest.companyName });
    }
  })

});
但当我登陆“谢谢”页面时,我的PDF并没有开始下载。此外,我的console.log(foundRequest)似乎在我的终端中一次又一次地快速登录,我还收到以下错误:


我知道我在这里可能有些不知所措,因为我在异步方面没有太多经验。我相信这是一个简单的修复我错过;然而,任何帮助(和解释)都将是非常宝贵和感激的。谢谢你抽出时间

您正在对同一响应对象调用
send
render
。您可以发送数据或发送html,但不能对同一请求执行此操作。
通常情况下,打开一个新标签进行下载可以解决这个问题。

谢谢您的评论。您认为最好为PDF生成添加另一个路由,然后在页面加载后用AJAX调用Javascript调用该路由吗?或者把它连接到一个按钮上。这正是我目前的想法,但我希望有更多的想法。发送AJAX意味着您需要在客户端处理它——您需要实现如所述的内容。只需在表单中添加
target=“\u blank”
即可打开新选项卡,但仍需要一些代码来满足第二个要求–在表单提交后更改页面。