【问题标题】:await not working on res.app.render in Express.js等待不在 Express.js 中处理 res.app.render
【发布时间】:2023-01-20 18:27:43
【问题描述】:

我想生成多个 pdf 文件并附加到电子邮件中。但是 await 似乎无法在 res.app.render 上工作。

route.get('/:id/receipts', async function (req, res) {
   ...
   let attachments = [];
   for await(let item of items){
      res.view.item = item;
      console.log(1)
      await res.app.render('pdfs/receipt', res.view, async function(err, html){
         console.log(2)
         if (err) return res.end(err.stack)
         return await pdf.create(html).toBuffer(async function(err, buffer){
            console.log(3)
            attachments.push({
               content: buffer,
               filename: 'receipt.pdf',
           })
         });
      });
   }
   console.log(4)
   ...
})

期待结果:

1
2
3
4

实际结果:

1
4
2
3

【问题讨论】:

  • 这是正确的行为,因为 console.log(4) 不在 for await 块中,并且它同步运行。

标签: node.js express async-await


【解决方案1】:

我认为 res.app.render 没有返回一个承诺,这就是你面临这个问题的原因。您必须做出自定义承诺。我希望以下代码对您有所帮助。

    oute.get('/:id/receipts', async function (req, res) {
    ...
    let attachments = [];
    for await(let item of items){
    res.view.item = item;
    console.log(1)
    const customPromise = new Promise((resolve, reject) => {
            res.app.render('pdfs/receipt', res.view, async function(err, html){
            console.log(2)
            if (err) { res.end(err.stack);reject()}
            else {
                await pdf.create(html).toBuffer(async function(err, buffer){
                    console.log(3)
                    attachments.push({
                        content: buffer,
                        filename: 'receipt.pdf',
                    })
                });
                resolve();
            }
    });
    })
    }
    console.log(4)
    ...
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多