[英]avoiding callback hell losing variable scope
我是Node.js的新手,在嘗試取消回調地獄時遇到問題。 現在,我正在開發一個endpoitn,以便在mongo數據庫中注冊用戶,而我的問題是,如果我對使用它們的函數進行模塊化,則會失去對某些變量的訪問權限。
編碼:
工作回調地獄:
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函數中訪問變量res和user。
有什么辦法可以在函數范圍內獲得兩個變量,還是這次我不得不承擔回調地獄的責任?
謝謝!
您可以在上下文signIn
定義saveUser
和addUser
函數,以便它們可以訪問其參數和局部變量:
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");
}
}
};
可以使用回調,也可以將任何作用域內的變量作為附加參數傳遞。
您可以將第一個參數添加到例如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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.