Async call to SQL Server inside a class on another .JS file

Viewed 35

I have the following code on a file called utils.js:

class functions {
validateUser(userId, userKey, sessionKey, plId) {
        let response = {
            validated: false,
            isAdmin: false,
            isCorporate: false
        }
         sql.connect(process.env.DB_CONNSTRING, function (err) {
            if (err) { msg.success = "0"; msg.message = "ERR_04: Could not connect to server."; res.json(msg); return; };
            let sqlString = `SELECT userLevel FROM dbo.users WHERE (userId =@userId) AND (userKey = @userKey) 
            AND (sessionKey = @sessionKey) and (plId = @plId)`
            let request = new sql.Request();
            request.input('userId', sql.Int, userId);
            request.input('userKey', sql.NVarChar, userKey);
            request.input('sessionKey', sql.NVarChar, sessionKey);
            request.input('plId', sql.Int, plId);
            request.query(sqlString, function (err, results) {
                if (err) { msg.success = "0"; msg.message = "ERR_07: Could not connect to server."; res.json(msg); return; };
                if (results.rowsAffected[0] != 0) {
                    response.validated = true;
                    if (results.recordset[0].userLevel == 1 || results.recordset[0].userLevel == 10) {
                        response.isAdmin = true;
                    };
                    if (results.recordset[0].userLevel == 10) {
                        response.isCorporate = true;
                    };
                    return (response);
                }
                else {
                    return (response);
                };
            });
        });
    };
}
module.exports = { functions };

Which is basically to validate if the logged user has the right credentials.

From a second .js file, I am requiring this file:

const utils = require('../utils/utils')
const functions = new utils.functions;

and then, on the router.post Im calling validateUser like this:

let AuthUser = async () => {
        const string = await functions.validateUser(payload.body.credentials.userId, payload.body.credentials.userKey, payload.body.credentials.sessionKey, payload.body.credentials.plId);
        return string;
    };
let isValid = AuthUser();
console.log(isValid)

But instead of getting the expected values on the console, I get

Promise { <pending> }

I tried making validateUser async but I still get the same results.

The idea is to continue running code after I get and process the results from validateUser

Any help will be appreciated.

Thanks.

1 Answers
class functions {
  validateUser(userId, userKey, sessionKey, plId) {
    return new Promise((resolve, reject) => {
      try {
        let response = {
          validated: false,
          isAdmin: false,
          isCorporate: false
        }
        sql.connect(process.env.DB_CONNSTRING, function (err) {
          if (err) throw err
          let sqlString = `SELECT userLevel FROM dbo.users WHERE (userId =@userId) AND (userKey = @userKey) AND (sessionKey = @sessionKey) and (plId = @plId)`
          let request = new sql.Request();
          request.input('userId', sql.Int, userId);
          request.input('userKey', sql.NVarChar, userKey);
          request.input('sessionKey', sql.NVarChar, sessionKey);
          request.input('plId', sql.Int, plId);
          request.query(sqlString, function (err, results) {
            if (err) {
              msg.success = "0"; msg.message = "ERR_07: Could not connect to server.";
              res.json(msg);
              resolve(res)
            } else {
              if (results.rowsAffected[0] != 0) {
                response.validated = true;
                if (results.recordset[0].userLevel == 1 || results.recordset[0].userLevel == 10) {
                  response.isAdmin = true;
                };
                if (results.recordset[0].userLevel == 10) {
                  response.isCorporate = true;
                };
              }
              resolve(response)
            }
          });
        });
      } catch (err) {
        reject(err)
      }
    })
  };
}

let AuthUser = () => {
  return new Promise(async (resolve, reject) => {
    try {
      const string = await functions.validateUser(payload.body.credentials.userId, payload.body.credentials.userKey, payload.body.credentials.sessionKey, payload.body.credentials.plId);
      resolve(string)
    } catch (err) {
      reject(err)
    }
  })
};
let isValid = await AuthUser();
console.log(isValid)

its console.logging the response that hasnt finished firing yet

Related