我正在申请注册系统。我使用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){
后面显示t
和info
值的那个。所有其他console.log
都没有显示。
我不知道如何解决这个问题。也许它是我不明白的细节。 Plaese帮助。
由于
答案 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
。