簡體   English   中英

Node js Async/Await 並返回未按預期工作

[英]Node js Async/Await and return not working as expected

我正在嘗試使用 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 后發送響應。 但它沒有返回任何東西。

您的test function 需要返回一些東西。 pdf.create(document...)之前添加一個return

你的test方法不會等待任何東西,因為你沒有告訴它。 它也不返回任何東西。 在您的pdf promise 前面添加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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM