0

Being new to Node's way of doing things, I am quite confused about how to do what seems to be a trivial use-case:

  • for a login page, to verify that the passed login/pwd are accurate, i fire a query
    • the query resides in a custom module that is in a separate script.

e.g.

var userName = req.body.username;
var userPwd = crypto.hash(req.body.password);
var user = db.getUser(userName, userPwd);
if (user.id) {
     console.log("valid login entered");
} else {
    console.log("INVALID login entered");
}

the db.getUser fn is in a separate file called "db.js". the code in that file is as follows:

var pg = require("pg");
var conString = "pg://<connection string to PostgreSQL DB>";
var client = new pg.Client(conString);
client.connect();
exports.response = [];

exports.getUser = function(username, password) {

    var query = "SELECT id, first_name, last_name FROM usertable where login = $1 and password = $2";

    var query = client.query({
            text: query,
            values: [username, password]
        });

        query.on("row", function (row) {
           console.log("Returned row from getUser query:" + row.id + " and fname:" + row.first_name + " and lname:" + row.last_name);
            response.push(row);
            return response;
    });

    query.on("end", function (result) {
        client.end();
    });
};

due to the callback mechanism, the code enters the "INVALID login entered" debug stmt before the query is done executing.

I guess my main question is: if i want to keep all the DB query code in a separate include file (as opposed to cluttering up the main controller file with that code), how can i ensure that the DB function finishes running and returns a value to the calling code, before the rest of the code executes?

1 Answer 1

1

Ok, found the answer (at least, an answer; there might be more ways to do this better).

I changed the calling code from:

var user = db.getUser(userName, userPwd);

to:

 var user = db.getUser(userName, userPwd, function(response) {
            console.log("USER INFO:");
            console.log(response, null, "    ");
        });

and modified the db.getUser function from:

exports.getUser = function(username, password) {

    var query = "SELECT id, first_name, last_name FROM usertable where login = $1 and password = $2";

    var query = client.query({
            text: query,
            values: [username, password]
        });

        query.on("row", function (row) {
           console.log("Returned row from getUser query:" + row.id + " and fname:" + row.first_name + " and lname:" + row.last_name);
            response.push(row);
            return response;
    });

    query.on("end", function (result) {
        client.end();
    });
};

to:

exports.getUser = function(username, password, callback) {

    var query = "SELECT id, first_name, last_name FROM usertable where login = $1 and password = $2";

    var query = client.query({
            text: query,
            values: [username, password]
        });

        query.on("row", function (row) {
           console.log("Returned row from getUser query:" + row.id + " and fname:" + row.first_name + " and lname:" + row.last_name);
            response.push(row);
            return callback(response);
    });

    query.on("end", function (result) {
        client.end();
    });

That did the trick ! : ) . Please do let me know if this approach is acceptable, or whether there's a better way of doing it.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.