【问题标题】:Node js Async/Await and return not working as expectedNode js Async/Await 并返回未按预期工作
【发布时间】:2021-04-25 22:33:32
【问题描述】:

我正在尝试使用 node express 构建一个简单的报表服务器。但是,它没有按预期运行。

这是我生成报告的 api 端点:

router.post('/test', async function (req, res) {
  return res.json(await reportService.test());
});

这是服务层:

var pdf = require("pdf-creator-node");
var fs = require("fs");
var path = require("path");
var base64Util = require("../utils/base64util");

async function test() {

  var html = fs.readFileSync(path.join(__dirname, "../templates/test.html"), "utf8");

  var options = {
    format: "A3",
    orientation: "portrait",
    border: "10mm",
    header: {
      height: "45mm",
      contents: '<div style="text-align: center;">header</div>'
    },
    footer: {
      height: "28mm",
      contents: {
        first: 'Cover page',
        2: 'Second page',
        default: '<span style="color: #444;">{{page}}</span>/<span>{{pages}}</span>',
        last: 'Last Page'
      }
    }
  };

  var users = [{
      name: "Shyam",
      age: "26",
    },
    {
      name: "Navjot",
      age: "26",
    },
    {
      name: "Vitthal",
      age: "26",
    },
  ];

  var document = {
    html: html,
    data: {
      users: users
    },
    path: path.join(__dirname, "../reports/test.pdf"),
    type: "",
  };

  pdf
    .create(document, options)
    .then(async (res) => {
      logger.info("Report Generated: " + res.filename);
      let base64 = await base64Util.convert("../reports/test.pdf");

      return {
        success: true,
        url: res.filename,
        base64: base64
      };
    })
    .catch((error) => {
      logger.error(error);

      return {
        success: false
      };
    });
}

module.exports = {
  test
}

这是pdf转base64的方法:

const pdf2base64 = require('pdf-to-base64');
var path = require("path");

async function convert(filePath){
pdf2base64(path.join(__dirname, filePath))
.then(
    (response) => {
        return response;
    }
)
.catch(
    (error) => {
        logger.log(error);
        return false;
    }
)}

module.exports = {
 convert
}

我想在生成 pdf 然后将其转换为 base64 后发送响应。但它没有返回任何东西。

【问题讨论】:

  • 您错误地将asyncconvert 一起使用,没有return 值。 test 函数相同。 .then(response =&gt; { return response }) 也没有做任何事情。 async function convert(filePath) { return await pdf2base64(...) } 实际上返回一个值,但它是一种反模式。只需写function convert(filePath) { return pdf2base64(...) } 或简单地写const convert = filePath =&gt; pdf2base64(...)。为调用者留下错误处理
  • 你对asyncawait有几个误解。我会推荐this Q&Athis Q&A
  • 有效!谢谢你的帮助。我应该学习更多 Async/Await :)

标签: javascript node.js express async-await


【解决方案1】:

你的test 方法不会等待任何东西,因为你没有告诉它。它也不返回任何东西。在您的pdf 承诺前添加return

  return pdf
    .create(document, options)
    ...

这同样适用于pdf2base64 呼叫。

function convert(filePath) {
  return pdf2base64(path.join(__dirname, filePath))
    ...
}

此外,您将这些方法指定为 async,但实际上您并没有使用任何 async/await 承诺。你可以摆脱它们,传统的Promises 不需要它们。

https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

【讨论】:

  • .then(response =&gt; resposne) 没有。删除它,它什么都不做。 .catch(e =&gt; ...) 不,不要吞下错误。允许调用者相应地处理错误。除了return pdf2base64(...) 什么都不需要
  • 当然。但这不是问题的一部分。
  • 为了清楚起见,我删除了它,修复演示没有必要。
【解决方案2】:

你的test 函数需要返回一些东西。在pdf.create(document...) 之前添加return

【讨论】:

  • 感谢您的指导。但我需要返回 pdf url 和 base64。
  • @ArunaRanathunge 你只能为他们返回一个承诺,而这正是这个答案提出的代码所做的。
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 2021-03-11
  • 2020-03-24
  • 2019-09-25
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多