【问题标题】:How can I resolve this pdf-generator problem?如何解决这个 pdf 生成器问题?
【发布时间】:2021-05-06 10:10:09
【问题描述】:

我是外地新手。 我尝试使用 html-pdf 包使用 express.js 制作 pdf 生成器 Web 应用程序。 我对engagement 变量有条件

module.exports =
({rs,periode,engagement,siren,num,rue,codePostal,ville,contratRef,commentaire,nomPrenom,fonction,phone,mail}) => {
const today = new Date();
return `
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <script>



    window.onload = function test() {


      var o = (document.getElementById('choix1'));
      var u = (document.getElementById('choix2'));


      if (${ engagement } == "oui") {
        o.checked = true;
      }else if (${ engagement } == "non") {
        u.checked = true
      }
    }


  </script>

当客户端将数据发送到后端时,应用程序崩溃并在我的终端中出现错误“无法在将标头发送到客户端后设置标头”。我该如何解决这个问题?

服务器 API 代码:

app.post('/pdf', (req, res) => {
  pdf.create(pdfDocument(req.body), {}).toFile('result.pdf', (err) => {
    if(err) { res.send(Promise.reject()); }
    res.send(Promise.resolve());
  });
});

【问题讨论】:

  • 这看起来像是服务器端代码中的问题。你能分享被调用 API 的请求处理程序代码吗?
  • app.post('/pdf', (req, res) => { pdf.create(pdfDocument(req.body), {}).toFile('result.pdf', (err ) => { if(err) { res.send(Promise.reject()); } res.send(Promise.resolve()); }); });

标签: javascript node.js reactjs express pdf-generation


【解决方案1】:

如果响应返回两次,或者在响应返回后设置了标头,我们通常会得到cannot set headers after they are sent to the client。您可以在以下堆栈溢出帖子中了解更多信息:

Error: Can't set headers after they are sent to the client

如果响应对象没有从任何其他中间件更新,除了请求处理程序代码共享,pdf.create 有可能返回错误,res.send 被调用两次 -

  1. 在 if 块内出现错误和
  2. res.send if 之后的语句

如果您在res.send 之前添加返回,如下所示,问题应该得到解决

app.post('/pdf', (req, res) => {
  pdf.create(pdfDocument(req.body), {}).toFile('result.pdf', (err) => {
    if(err) {
      return res.send(`Error in generating PDF`);
    }
    return res.send(`PDF created successfully!`);
  });
});

另外,我不确定您为什么要返回 Promise.resolve() / Promise.reject() 作为响应。

【讨论】:

  • (node:10004) UnhandledPromiseRejectionWarning: undefined (node:10004) UnhandledPromiseRejectionWarning: 未处理的承诺拒绝。
  • 那是因为您返回 Promise.reject() 作为响应。我不确定您为什么要这样做(在答案的最后一行中也提到了同样的事情)。您必须返回正确的响应才能解决此问题。
  • 我不知道我为什么这样做,因为我在教程视频中跟随某人来做这个网络应用程序我是这个领域的新手,就像我从一开始就说的那样
  • 现在,我将更新答案以返回字符串作为响应,这样异常就消失了。您必须根据 API 要求对其进行更新。
  • 应用程序没有崩溃,也没有工作。变量没有到达后端
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多