如何从另一个函数调用Express函数?

时间:2019-08-15 17:20:08

标签: javascript node.js express

我有以下表达功能:

const token = require("./auth").genToken;
const rp = require("request-promise");
const url = "https://books.zoho.com/api/v3/";

module.exports = {
  async listInvoices(req, res) {
    let response;
    try {
      const full_url = url + "invoices";
      const auth = await token();

      response = await rp({
        url: full_url,
        method: "GET",
        headers: auth,
        json: true
      });

      return res.json(response);
    } catch (error) {
      return res.status(400).send({ error });
    }
  },

  async listBankTransactions(req, res) {
    let response;
    try {
      const full_url = url + "banktransactions";
      const auth = await token();

      response = await rp({
        url: full_url,
        method: "GET",
        headers: auth,
        qs: req.body,
        json: true
      });

      return res.json(response);
    } catch (error) {
      return res.status(400).send({ error });
    }
  },

  async matchTransactions(req, res) {
    let transactions = await module.exports.listBankTransactions(req, res);
    let invoices = await module.exports.listInvoices(req, res);
  }
};

它们有不同的路线,我可以给他们打电话。但是,我希望matchTransactions函数调用listInvoiceslistBankTransactions并将它们的响应存储在变量中,以便我可以操纵这些数据,然后返回matchTransactions响应。

我的代码现在是这样,listBankTransactions返回响应而不是存储在transactions常量中,然后listInvoices响应中有一个异常,因为响应已经由listBankTransactions返回。

实现我正在寻找的最佳方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

我最近遇到了同样的问题,没有找到您可能在想的解决方案。 ;)我的处理方式是将函数的重复代码外包给不是中间件的外部函数,并使它们返回promise / resolved promise。也许会对您有帮助。我发现“赶上来”表示法要好得多。

const middlewareA = (req, res, next) => {
    ascyncCodeOfMiddlewareA
    .then(externalLogicFunction)
    .then(...)
    .catch(...)
}

const middlewareB = (req, res, next) => {
    externalLogicFunction()
    .then(...)
    .catch(...)
}

const externalLogicFunction = () => {
    ...
    return Promise.resolve(something);
}