avoiding callback hell losing variable scope

I'm new to Node.js and I'm having problems trying to aboid callback hell. Now I'm developing an endpoitn to register users in a mongo database, the problem I'm facig is that I lose the acces to some variables if I modularize the function where they are used.

The code:

Working callback hell:

    var mongoose = require('mongoose'),
    dbserver = 'mongodb://localhost/',
    dbname = 'authdb';


mongoose.connect(dbserver + dbname);

var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));

db.once('open', function callback () {
  console.log('connectet to mongo db: ' + dbname);
})



userModel = require('./user.js');



function singIn (req, res){

    var email = req.body.email,
    name = req.body.name,
    secondName  = req.body.secondName,
    pass = req.body.pass,
    bday = req.body.bday;

    var user = new userModel.user();

    user.Email = email;
    user.Name = name;
    user.SecondName = secondName;
    user.Pass.Hash = pass;
    user.BirthDate = bday;



    db.model('user').find({Email : email},function (err,foundUsers){

    if(!err && foundUsers.length === 0){

        user.save(function (err, users){
    if(err){
        console.log(err);
        res.send("Not inserted");

    }else{
            console.log(user);
            console.log('registered!');
            res.send("OKish");
    }
});
    }else{
        console.log(err);
        console.log(foundUsers);

        res.send("Not inserted");
    }

});

};


exports.singIn  = singIn;

Not working modularized

var mongoose = require('mongoose'),
    dbserver = 'mongodb://localhost/',
    dbname = 'authdb';


mongoose.connect(dbserver + dbname);

var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));

db.once('open', function callback () {
  console.log('connectet to mongo db: ' + dbname);
})



userModel = require('./user.js');



function singIn (req, res){

    var email = req.body.email,
    name = req.body.name,
    secondName  = req.body.secondName,
    pass = req.body.pass,
    bday = req.body.bday;

    var user = new userModel.user();

    user.Email = email;
    user.Name = name;
    user.SecondName = secondName;
    user.Pass.Hash = pass;
    user.BirthDate = bday;



    db.model('user').find({Email : email},addUser);

};


function saveUser(err, users){
    if(err){
        console.log(err);
        res.send("Not inserted");

    }else{
            console.log(user);
            console.log('registered!');
            res.send("OKish");
    }
}

function addUser(err,foundUsers){

    if(!err && foundUsers.length === 0){

        user.save(SaveUser);
    }else{
        console.log(err);
        console.log(foundUsers);

        res.send("Not inserted");
    }

}   




exports.singIn  = singIn;

The problem here is that in the second snippet I can't acces the variables res and user in the functions addUser and saveUser.

Is there any way to get both variables in the scope of the functions or I have to bear whit the callback hell this time?

Thank you!

You can define the saveUser and addUser functions within the context signIn so that they have access to its parameters and local variables:

function signIn (req, res){    
    var email = req.body.email,
    name = req.body.name,
    secondName  = req.body.secondName,
    pass = req.body.pass,
    bday = req.body.bday;

    var user = new userModel.user();    
    user.Email = email;
    user.Name = name;
    user.SecondName = secondName;
    user.Pass.Hash = pass;
    user.BirthDate = bday;

    db.model('user').find({Email : email},addUser);

    function saveUser(err, users){
        if(err){
            console.log(err);
            res.send("Not inserted");
        }else{
            console.log(user);
            console.log('registered!');
            res.send("OKish");
        }
    }

    function addUser(err,foundUsers){
        if(!err && foundUsers.length === 0){
            user.save(saveUser);
        }else{
            console.log(err);
            console.log(foundUsers);
            res.send("Not inserted");
        }
    }       
};

Either go with callbacks, or pass any in-scope variables as extra parameters.

You can add a first parameter to e.g saveUser and bind it to res:

function saveUser(res, err, users){
    if(err){
        console.log(err);
        res.send("Not inserted");

    }else{
            console.log(user);
            console.log('registered!');
            res.send("OKish");
    }
}

and then

user.save(saveUser.bind(null,res));