避免callback地狱丢失variables范围

我是Node.js的新手,我试图拒绝callback地狱的问题。 现在我正在开发一个在mongo数据库中注册用户的endpoitn,我遇到的问题是,如果我使用模块化函数,那么我将失去对某些variables的访问权限。

代码:

工作callback地狱:

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中的variablesres和user。

有什么办法可以让这两个variables在函数的范围内,或者我不得不忍受这次的callback地狱?

谢谢!

您可以在上下文signIn定义saveUseraddUser函数,以便它们可以访问其参数和局部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"); } } }; 

要么callback,要么作为额外的parameter passing任何范围内的variables。

您可以添加第一个参数,例如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));