2016-02-09 60 views
0

我正在做一個簡單的選擇查詢到數據庫的登錄系統。我應該從數據庫中獲取一條記錄,然後比較密碼,但我正在努力讓這部分工作主要是讓選擇查詢返回我需要的內容。這是我斯卡拉斯利克選擇查詢時執行錯誤

def example() = Action.async { 

    val myquery=sql"""SELECT password,id,email from profiles where [email protected]""".as[(String,Int,String)] 


    dbcall.run(myquery.map { Result => 

     Result.headOption match { 
     case d: (String, Int,String) => 
      if (BCrypt.checkpw("mypassword", d._1)) { 
      Ok("it worked") 
      } 
      else 
      Ok("No match") 

     case None => Ok("Empty") 
     } 
    } 

    } 

此代碼的工作,但它沒有返回回到正確的格式,它給我的錯誤,指出:

[MatchError:有些(($ 2A $ 12 $ HoNBl1DBlH .X,32,hetmam @ yahoo.com))(類scala.Some)]

注意上面是我想要的正確值,但是我想嚴格得到第一列:我認爲的密碼我在這裏...

BCrypt.checkpw("mypassword", d._1) 

但是我只是在Result.headOption匹配得到一個匹配異常錯誤,是不是d._1假設只給出`密碼列值?

回答

2

Result.headOption返回Option[(String, Int, String)],但您在(String, Int, String)上匹配。你可以嘗試這樣的事情,而不是:

Result.headOption match { 
    case Some((password, _, _)) => 
     if (BCrypt.checkpw("mypassword", password)) { 
     Ok("it worked") 
     } else { 
     Ok("No match") 
     } 

    case None => Ok("Empty") 
    } 
} 

case Some((password, _, _)),我們所說的元組password的第一個成員,我們使用通配符_基本上忽略元組的第二個和第三個成員。然後,在右側,我們可以參考password而不是d._1

+0

完美的感謝很多隻是實施,它是工作 – user1591668