簡體   English   中英

避免回調地獄失去變量作用域

[英]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定義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");
        }
    }       
};

可以使用回調,也可以將任何作用域內的變量作為附加參數傳遞。

您可以將第一個參數添加到例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM