gempir
gempir

Reputation: 1911

nodejs mysql using data in other modules/files

I'm trying to get data from my DB and use it in different modules of my app. My app is split in a lot of modules which I require where I need them.

My connectDB.js module looks like this

var mysql = require('mysql');

var db = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "pw",
  database : "something"
});

db.connect(function(err){
  if(err){
    console.log('Error connecting to Db');
    return;
  }
  console.log('Database connected');
});

function select(query) 
{
    db.query(query,function(err,rows){
        if(err) throw err;
        return rows;
    });
}

module.exports = 
{
    select
}

I was hoping to simply just require this module and then do a something like

db.select('SELECT * FROM users');

But for some reason the return value is always "undefined"

Sending queries inside the connectDB module works as expected returning the correct data. But I can't use my function to get data.

Is there something wrong here with my logic? Can you help what I am doing wrong?

Upvotes: 0

Views: 1571

Answers (2)

Nazar Sakharenko
Nazar Sakharenko

Reputation: 1007

As I remember, connection.query will return result async, so you need to wrap it with callback or Promise.

var mysql = require('mysql');

function DB {
var db = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "pw",
  database : "something"
});

db.connect(function(err){
  if(err){
    console.log('Error connecting to Db');
    return;
  }
  console.log('Database connected');
});

this.select = function(query, callback) {
    db.query(query,function(err,rows){
        if(err) throw err;
        callback(rows);
    });
}

//Promise version
this.selectPromise = function(query) {
  return new Promise(function(resolve, reject){
    db.query(query,function(err,rows){
        if(err) reject(err);
        resolve(rows);
    });
  });
 }
}
module.exports = DB;

How to use:

var DB = require('your-module');

var db = new DB();

db.query('select * from table', function(result) {
   console.log(result);
});

db.selectPromise('select * from table').then(function(result) {
   console.log(result);
});

Upvotes: 3

Rashad Ibrahimov
Rashad Ibrahimov

Reputation: 3319

Make the following change to your code

module.exports = 
{
    select: select
}  

And you forgot about callback function

function select(query, callback) 
{
    db.query(query,function(err,rows){
        if(err) throw err;
        return callback(rows);
    });
}

Then you can pass a function like this:

db.select('SELECT * FROM users', function(rows) {
    // Do stuff with rows
});

Upvotes: 2

Related Questions