查询在第二次执行时挂起

我正在考虑一个注册系统。 我使用节点,expression和我的数据库是PostgreSQL。 我使用最新的PG模块与Postgre进行通信。

我的用户获取function是多用途的,根据用户名或用户名得到用户。 (后端)

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 ,然后执行完毕。

我在查询中放了几个console.log ,只有一个返回数据。 User.get = function (info,t, fn){显示tinfo的值。 所有其他console.log显示什么。

我不知道如何解决这个问题。 也许它的细节我没有得到。 平板帮助。

谢谢

我改变了我的用户获取function

 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