2014-07-23 66 views
1

我是新来的Node.js,我有问题试图拒绝回调地狱。 现在我正在开发一个在mongo数据库中注册用户的endpoitn,我遇到的问题是,如果我在使用它们的地方对模块化函数进行模块化,则会失去对某些变量的访问权限。避免回调地狱丢失变量范围

代码:

工作回调地狱:

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; 

不在这里工作模块化

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; 

的问题是,在第二个片段,我不能存取权限变量资源和用户在函数addUser和saveUser中。

有没有办法让这两个变量在函数的范围内,或者我必须忍受这次的回调地狱?

谢谢!

回答

1

可以上下文signIn中定义的saveUseraddUser功能,使他们可以访问其参数和局部变量:

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"); 
     } 
    }  
}; 
+1

但是这会失去对模块化的关注,至于其他可能使用saveUser和addUser方法的操作,您将不得不重新定义它们。 – webduvet

+0

@ lombausch可能,但这些函数似乎专用于'signIn'。 – JohnnyHK

+0

我试过了,它在fisrt实例中工作,但是我无法访问从addUser调用的saveUser函数。我也尝试在addUser中声明saveUser,但它不起作用。你有痛风吗? – user2113500

0

要么回调,要么传入任何范围内的变量作为额外的参数。

0

您可以添加第一个参数,例如saveUser并将其绑定到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"); 
    } 
} 

然后

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

请你详细说明我无法得到这个工作。谢谢! – user2113500