2016-01-11 28 views
1

我正在查找一個註冊系統。我使用節點,表達和我的數據庫是PostgreSQL。我使用最新的pg module與Postgre溝通。查詢在第二次執行時掛起

我的用戶獲取功能是多用途的,根據用戶名或用戶名獲取用戶。 (後端)

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什麼也沒有顯示。

我不知道如何解決這個問題。也許它的細節我沒有得到。 Plaese幫助。

感謝

+0

你確定它是查詢掛起而不是你的web服務器?查看可能的相關問題:http://stackoverflow.com/questions/34521804/pg-promise-hangs-after-six-queries。如果它與node-postgres相關,請查看[pg-promise](https://github.com/vitaly-t/pg-promise),它使用起來更容易。 –

+0

@ vitaly-t查看我的答案,並請評論,如果我說得對。謝謝 – slevin

回答

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