Home > front end >  Async call to Authorize.net not working as expected in node.js
Async call to Authorize.net not working as expected in node.js

Time:10-06

Im setting an Authorize.com charge as per their API reference at https://developer.authorize.net/api/reference/index.html in Node.js.

I can place both ACH and CC transactions just fine, but Im facing a problem with the response from Authorize. Their response takes about 1 second.

After all the parameters such as CC number, expiration date, etc are filled out, I execute a function as follows (ctrl.execute(function () {}):

var ctrl = new ApiControllers.CreateTransactionController(createRequest.getJSON());
ctrl.execute(function () {
var apiResponse = ctrl.getResponse();
var response = new ApiContracts.CreateTransactionResponse(apiResponse);
if (response != null) {
    if (response.getMessages().getResultCode() == ApiContracts.MessageTypeEnum.OK) {
        if (response.getTransactionResponse().getMessages() != null) {
            //transaction approved
            AuthorizeResult.status = 1;

         }
        else {
            //transaction rejected
            if (response.getTransactionResponse().getErrors() != null) {
                AuthorizeResult.status = 0;
             }
        }
    }
    else {
        if (response.getTransactionResponse() != null && response.getTransactionResponse().getErrors() != null) {
            AuthorizeResult.status = 0;
        }
        else {
   
            AuthorizeResult.status = 0;
        }
    }
}
else {
    AuthorizeResult.status = 0;
}

After I get a result from Authorize, I need to run this code, which Im unable to do, and if I place the code inside the function, I get an error:

SyntaxError: await is only valid in async function
at wrapSafe (internal/modules/cjs/loader.js:988:16)
at Module._compile (internal/modules/cjs/loader.js:1036:27)
sqlString = `
        insert into AuthorizeBillings (memberid, datetime, authorizeid, messagecode, status, amount, billingtype, errorcode)
        values (@memberid, @datetime, @authorizeid, @messagecode, @status, @amount, @billingtype, @errorcode )`
        try {
            const pool = await utils.poolPromise
            const recordset = await pool.request()
                .input('memberid', utils.sql.Int, memberid)
                .....
                .....
                .input('errorcode', utils.sql.NVarChar, AuthorizeResult.errorcode)
                .query(sqlString)
        } catch (err) {
            console.log(err)
        }

I tried to run this function await but I had no luck. What I need is to continue the code execution AFTER this function returned a value, which I am not able to accomplish properly.

Thanks.

CodePudding user response:

This probably isn't a proper answer... But maybe it will help you out. In order to use await, you have to declare the function as async. So, something like this will allow async workflow:

async function AuthorizeTrans() { // Notice async declaration
   var ctrl = new ApiControllers.CreateTransactionController(createRequest.getJSON());
     var AuthorizeResult = {
     memberid: memberid,
     .....
     .....
     errorcode: ""
    }
    const res = await ctrl.execute(); // You can now use await
    var apiResponse = await res.getResponse();
    
    ....... // Rest of code...

    SqlExecute(params);
}

async function SqlExecute(params) {
    sqlString = `
    insert into AuthorizeBillings (memberid, datetime, authorizeid, messagecode, status, amount, billingtype, errorcode)
    values (@memberid, @datetime, @authorizeid, @messagecode, @status, @amount, @billingtype, @errorcode )`
    try {
        const pool = await utils.poolPromise
        const recordset = await pool.request()
            .input('memberid', utils.sql.Int, memberid)
            .....
            .....
            .input('errorcode', utils.sql.NVarChar, AuthorizeResult.errorcode)
            .query(sqlString)
    } catch (err) {
        console.log(err)
    }
}

If you follow the logic from that syntax, you should be on the right track.

  • Related