Search code examples
callbacknestjsvonage

how to get callback return value in nestjs


I am going to use vonage for text service.

However, only node.js syntax exists, and the corresponding API is being used.

There is a phenomenon that the callback is executed later when trying to receive the values ​​returned from the callback to check for an error.

How can I solve this part? The code is below.

await vonage.message.sendSms(from, to, text, async (err, responseData) => {
      if (err) {
        console.log('1');
        result.message = err;
      } else {
        if (responseData.messages[0]['status'] === '0') {
          console.log('2');
        } else {
          console.log('3');
          result.error = `Message failed with error: ${responseData.messages[0]['error-text']}`;
        }
      }
    });
    console.log(result);
    return result;

When an error occurs as a result of executing the above code,

result{error:undefined}
3

Outputs are in order.


Solution

  • From what I can understand the issue is that you are passing a async callback. you could simply just give vonage.message.sendSms() a synchronous callback like so.

    const result = {};
    
    vonage.message.sendSms(from, to, text, (err, responseData) => {
          if (err) {
            console.log('1');
            result.message = err;
          } else {
            if (responseData.messages[0]['status'] === '0') {
              console.log('2');
            } else {
              console.log('3');
              result.error = `Message failed with error: ${responseData.messages[0]['error-text']}`;
            }
          }
    });
    

    if you want to use async or promises I would suggest something like this

    const sendSMS = (from, to, text) => new Promise( (resolve, reject) => {
      vonage.message.sendSms(from, to, text, (err, responseData) => {
        if (err) {
          reject(err);
        } else {
          resolve(responseData);
        }
      });
    });
    
    
    // elsewhere
    sendSMS(from, to, text)
      .then(...)
      .catch(...);