查询在第二次执行时挂起

时间:2016-01-11 16:07:55

标签: sql node.js postgresql

我正在申请注册系统。我使用node,express,我的数据库是PostgreSQL。我使用最新的pg module与Postgre进行通信。

我的用户获取功能是多功能的,根据用户ID或用户名获取用户。 (后端)

User.get = function (info,t, fn){
    var text;
    if(t=="id"){
        text = "SELECT user.id, user.usrnm FROM user WHERE user.id=$1";             
    }
    else{
        text = "SELECT user.id, user.usrnm, user.role FROM user WHERE user.usrnm=$1";
    }

    var query = client.query({ text:text, values:[info]}, function(err, result){
        if(err) {return fn(err);}
        query.on("row", function (row, result) {                   
            result.addRow(row);
        });
        if(result.rows.length==0){//no user found
            return fn(err, null);
            query.on("end", function(){client.end();});
        }
        if(t=="id"){
            return fn(null, new User({
                        id:result.rows[0].id,
                        usrnm:result.rows[0].usrnm
                    })
            );
            query.on("end", function(){clientGuest.end();});
        }
        else{
            return fn(null, new User({
                        id:result.rows[0].id,
                        usrnm:result.rows[0].usrnm,
                        role:result.rows[0].role
                    })
            );      
            query.on("end", function(){clientGuest.end();});    
        }       
    });
    query.on("end", function(){clientGuest.end();});    
}

所以,我使用上面的内容来检查是否有用户已经在使用用户名。如果没有,我保存新用户(注册。)(前端)

    User.get(username, "name", function(error, user){
        if(error) return next(err);
        if(user!=null){//so, we found a user
            res.error("Username already in use");
            res.redirect('back');
            res.end();
        }
        else{
            user = new User ({
                usrnm:username,
                pswrd:userpass
            });

            user.save(function(err){
                if(err) return next(err);
                req.session.uid=user.id;                                
            })
            res.redirect('/');
            res.end();
        }           

    })  
}); 

我是插入一个唯一的用户名还是已经使用过的用户名,第一次运行良好,第二次,数据被发送到User.get,然后exacution挂起。

我在查询中放了几个console.log,只有一个提供数据。 User.get = function (info,t, fn){后面显示tinfo值的那个。所有其他console.log都没有显示。

我不知道如何解决这个问题。也许它是我不明白的细节。 Plaese帮助。

由于

1 个答案:

答案 0 :(得分:1)

我将用户获取功能更改为此

User.get = function (info,t, fn){

var text;
if(t=="id"){
    text = "SELECT user.id, user.usrnm FROM user WHERE user.id=$1";             
}
else{
    text = "SELECT user.id, user.usrnm, user.role FROM user WHERE user.usrnm=$1";
}   
var query = client.query({ text:text, values:[info]}, function(err, result){  if(err) {return fn(err);} });
    query.on("row", function (row, result) {                   
        result.addRow(row);
    });

query.on("end", function(result){                       
    if(result.rows.length==0){return fn(null);}
    if(t=="id"){
        return fn( new User({
                     id:result.rows[0].id,
                     usrnm:result.rows[0].usrnm
                })
        );
    }
    else{
        return fn( new User({
                      id:result.rows[0].id,
                      usrnm:result.rows[0].usrnm,
                      role:result.rows[0].role
                })
        );      
    }                                                       
    client.end();
}); 

}

所以query.on row很简单,并添加行。当我们确定查询完成时,query.on("end"会采取措施并对行进行计数,从而决定返回什么。

我想我的问题是检查或行和t值在query.on end之外,因此有可能在查询完成之前发送数据或相反,查询结束在发送任何数据之前,根据查询搜索数据所需的时间,将它们带回并将其添加到result