Home > other >  Struggling to correctly make use of returned values from functions that are being called Asynchronou
Struggling to correctly make use of returned values from functions that are being called Asynchronou

Time:11-02

I have an Express server which serves as an API Request forwarding tool (i.e my client calls the express server, and the express server forwards that call to another API).

The way this server is supposed to work is that there is a single entry point which makes a request, and then based on the response makes further API requests and returns a result based on the combo of API request responses.

To be clearer, the main logic is as follows:

  1. Single entry point, which makes an async axios call to get an ID value
  2. Within this function, we call an async function, getPartnerDetails (passing that ID as the parameter)
  3. getPartnerDetailscalls a 3rd async function, '''getRawJson''' which is supposed to return the final required result, passing it back to '''getPartnerDetails''' which then passes it to the main entry point.

Whats going wrong is that the results are being recieved but are not being pass back correctly. The console logs within the '''.then(()=>{})''' of my async functions are coming back as '''undefined'''.

Code below:

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));
}

It might have something to do with how I'm using async and await, I'm new to it so I'm hoping that I'll learn a thing or 2 more about it by solving this project.

I'm also aware that maybe I should split the entry point out into 3 different entry points, and have the client manage the chaining of the requests and responses instead.

Thanks!!

CodePudding user response:

Probably an error due to incorrect async await usage.

Try to change your code like this:

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,
    })
}
  • Related