AnonBird
AnonBird

Reputation: 646

Share object between different file nodeJs

I have trouble sharing an object between app.js and an imported file.

app.js

'use strict';

module.exports = require('./lib/express');

var express = require('express');
var session = require('express-session');
var bodyParser = require('body-parser');
var sql = require('./lib/sqlRequete');
var app = express();

// Init database
var mysql      = require('mysql');
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'master2i'
});
connection.connect();

app.post('/ajaxRequete', urlencodedParser, function(req,res){
    sql.formerSql(req.body);
});

app.listen(port,function(){
    console.log("Le serveur est lancé et écoute sur le port "+port);
});

sqlRequete.js

'use strict';

var exports = module.exports = {};

exports.formerSql=function(req){

  var SQL;

  switch(req.action){
    case 'login':
      SQL = "SELECT * FROM users WHERE pseudo ='" + req.pseudo + "' AND pass = '" + req.psw + "'";
      this.executeSql(SQL,'SELECT');
      break;
  }
}

exports.executeSql=function(requete, type){

  switch(type){

    case 'SELECT':
      connection.query(requete, function(err,rows,fields){
         if (err){
          throw err;
        }else{
          console.log('The solution is: ',rows);
        }
      });
      break;
  }
}

sqlRequete.js cannot access variable and object from app.js. As an example, I can't access connection What are the solutions ? How should I structure my code ?

Upvotes: 0

Views: 2780

Answers (2)

Mukesh Sharma
Mukesh Sharma

Reputation: 9022

You can pass objects from app.js to sqlRequete.js file by the following way.

sqlRequete.js

module.exports = function(connection){
   function formerSql(req){
     var SQL;
     switch(req.action){
        case 'login':
          SQL = "SELECT * FROM users WHERE pseudo ='" + req.pseudo + "' AND pass = '" + req.psw + "'";
          this.executeSql(SQL,'SELECT');
          break;
     }
   }

   function executeSql(requete, type){
     switch(type){
       case 'SELECT':
          connection.query(requete, function(err,rows,fields){
          if (err){
            throw err;
          }else{
            console.log('The solution is: ',rows);
          }
       });
       break;
     }
   }  
   return { 
      formerSql : formerSql,
      executeSql : executeSql
   }
}

And in app.js, pass the connection object

 var mysql      = require('mysql');
 var connection = mysql.createConnection({
   host     : 'localhost',
   user     : 'root',
   password : '',
   database : 'master2i'
 });
 connection.connect();
 var sql = require('./lib/sqlRequete')(connection);

Upvotes: 2

sospedra
sospedra

Reputation: 14724

Usually you'll be using a third file (in your case scenario).

A resulting folder structure like this:

- index.js
- lib/
|__ orm.js
|__ app.js
|__ sqlRequete.js

Where the orm.js file is creating the connection an returning the instance:

var mysql      = require('mysql');
module.exports = function () {
    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : '',
        database : 'master2i'
    });
    connection.connect();

    // IMPORTANT
    // here is where you're sharing variables between files!
    return connection;
}

However, specifically for your example, I'd simply move the initialisation of the SQL instance to the sqlRequete.js file.

exports.start = function () {
    // Init database
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : '',
        database : 'master2i'
    });
    connection.connect();
}

And request it on the app.js:

var app = express();

sql.start();

Upvotes: 2

Related Questions