【问题标题】:Struggling to correctly make use of returned values from functions that are being called Asynchronously by Axios努力正确使用 Axios 异步调用的函数的返回值
【发布时间】:2021-11-01 22:34:31
【问题描述】:

我有一个 Express 服务器,用作 API 请求转发工具(即我的客户端调用 express 服务器,然后 express 服务器将该调用转发到另一个 API)。

这个服务器的工作方式应该是有一个单一的入口点发出请求,然后根据响应发出进一步的 API 请求,并根据 API 请求响应的组合返回结果。

为了更清楚,主要逻辑如下:

  1. 单一入口点,通过异步 axios 调用获取 ID 值
  2. 在这个函数中,我们调用了一个异步函数,getPartnerDetails(将该 ID 作为参数传递)
  3. getPartnerDetails调用第 3 个异步函数 '''getRawJson''',它应该返回最终所需的结果,将其传递回 '''getPartnerDetails''',然后将其传递到主入口点。

出了什么问题是结果被接收但没有被正确地传回。我的异步函数的 '''.then(()=>{})''' 中的控制台日志返回为 '''undefined'''。

代码如下:

app.post('/checkuser', async (req, res, next) => {
  const { man, bfn, bln, bsn, bc, bs, bz, bco } = req.body;
  const bodyContent = {
    man: man,
    bfn: bfn,
    bln: bln,
    bsn: bsn,
    bc: bc,
    bs: bs,
    bz: bz,
    bco: bco,
    profile: 'DEFAULT',
  };

  try {
    await axios
      .post('https://host.com/im/account/consumer', bodyContent, { headers })
      .then((response) => {
        const addressValidResult = response.data.score.etr.filter(
          (result) => result.test === '19:2'
        )[0];
        //  console.log(res.json(result.details));

        const requestId = response.data.mtid;
        const currentValidAddress = getPartnerDetails(requestId).then(
          (result) => {
            console.log('this is currentvalidaddress ' + result);
            res.json({
              validationMessage: addressValidResult,
              currentValidAddress: result,
            });
          }
        );
      })
      .catch((err) => next(err));
  } catch {}
});

async function getPartnerDetails(appId) {
  let config = {
    headers: {
      'Content-Type': 'application/json',
      Authorization: 'Basic M2QzMsdfsslkfglkdjfglkdjflkgd',
    },
    params: {
      partner: 19,
    },
  };

  const res = await axios
    .get(
      `https://host.com/im/account/consumer/${appId}/partner/requests`,
      config
    )
    .then((response) => {
      const requestId = response.data.requests[0].request_id;
      console.log('this is request id ' + JSON.stringify(requestId));
      const raw = getRawJson(appId, requestId).then((result) => {
        console.log('this is getRawJson result ' + JSON.stringify(result));
        return JSON.stringify(result);
      });
      // https://host.com/im/account/consumer/:appId/partner/request/:requestId
    })
    .catch((err) => console.log('err2' + err));
}

async function getRawJson(appId, requestId) {
  const res = await axios
    .get(`host.com/im/account/consumer/${appId}/partner/request/${requestId}`, {
      headers,
    })
    .then((response) => {
      console.log('this is response ' + JSON.stringify(response.data));
      return JSON.stringify(response.data);
    })
    .catch((err) => console.log('err1 ' + err));
}

这可能与我使用 async 和 await 的方式有关,我是新手,所以我希望通过解决这个项目我能学到一两点。

我也知道,也许我应该将入口点分成 3 个不同的入口点,并让客户端管理请求和响应的链接。

谢谢!!

【问题讨论】:

    标签: express axios


    【解决方案1】:

    可能由于不正确的async await 使用而导致错误。

    尝试像这样更改您的代码:

    app.post('/checkuser', async (req, res, next) => {
      const { man, bfn, bln, bsn, bc, bs, bz, bco } = req.body;
      const bodyContent = {
        man: man,
        bfn: bfn,
        bln: bln,
        bsn: bsn,
        bc: bc,
        bs: bs,
        bz: bz,
        bco: bco,
        profile: 'DEFAULT',
      };
    
      try {
        const { data } = await axios.post(
          'https://host.com/im/account/consumer',
          bodyContent,
          { headers }
        );
    
        const addressValidResult = data.score.etr.filter(
          (result) => result.test === '19:2'
        )[0];
    
        const requestId = data.mtid;
        const currentValidAddress = await getPartnerDetails(requestId);
        console.log('this is currentvalidaddress ' + currentValidAddress);
        res.json({
          validationMessage: addressValidResult,
          currentValidAddress: currentValidAddress,
        });
      } catch (err) {
        next(err);
      }
    });
    
    async function getPartnerDetails(appId) {
      let config = {
        headers: {
          'Content-Type': 'application/json',
          Authorization: 'Basic M2QzMsdfsslkfglkdjfglkdjflkgd',
        },
        params: {
          partner: 19,
        },
      };
    
      const { data } = await axios.get(
        `https://host.com/im/account/consumer/${appId}/partner/requests`,
        config
      );
    
      const requestId = data.requests[0].request_id;
      console.log('this is request id ' + JSON.stringify(requestId));
      return getRawJson(appId, requestId);
    }
    
    function getRawJson(appId, requestId) {
      return axios
        .get(`host.com/im/account/consumer/${appId}/partner/request/${requestId}`, {
          headers,
        })
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 1970-01-01
      • 2021-02-20
      • 2020-03-24
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2014-05-11
      相关资源
      最近更新 更多