2014-07-23 70 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